将结果当你大步走的时候依赖于输入数据类型?

2024-04-29 17:00:15 发布

您现在位置:Python中文网/ 问答频道 /正文

^{}的结果是否取决于NumPy数组的数据类型?在

这个问题源于.strides的定义,即

Tuple of bytes to step in each dimension when traversing an array.

用我在其他问题中用到的函数。它采用1d或2d数组并创建长度为window的重叠窗口。结果将比输入大一个维度。在

def rwindows(a, window):
    if a.ndim == 1:
        a = a.reshape(-1, 1)
    shape = a.shape[0] - window + 1, window, a.shape[-1]
    strides = (a.strides[0],) + a.strides
    windows = np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
    return np.squeeze(windows)

# examples
# rwindows(np.arange(5), window=2)
# rwindows(np.arange(20).reshape((5,4)), window=2)

因为跨距的定义,并且因为,例如,否则dtype float32和{}的等价数组将具有不同的跨距,这是否会破坏我上面的rwindows函数?在

我已经尝试过测试,但它是以一种非详尽的方式进行的,并且正在寻找一个答案:(1)解释来自函数doc的免责声明/警告是否与我在这里提出的问题有任何关系,(2)解释为什么或者为什么不以其他方式使用不同数据类型和跨距的等效数组在上述结果中会产生不同的结果。在


Tags: 函数numpy定义windowsnp方式数组window
1条回答
网友
1楼 · 发布于 2024-04-29 17:00:15

否,as_strided的警告是针对两个与数据大小无关的问题,以及写入结果视图的结果。在

  1. 首先,没有保护来确保view = as_strided(a . . . )只有指向a中的内存。这就是为什么在调用as_strided之前要进行如此多的精心准备工作。如果您的算法是关闭的,您可以轻松地让您的view指向不在a中的内存,该内存可能确实是针对垃圾、其他变量或操作系统的。如果您随后写入该视图,您的数据可能会丢失、放错位置、损坏。或者让你的电脑崩溃。在

对于您的特定示例,它的安全性在很大程度上取决于您使用的是什么输入。您已经用a.strides设置了strides,因此这是动态的。你可能想assertdtype不是什么奇怪的东西object。在

如果您确定您将始终拥有大于window的二维a,那么您可能对您的算法很满意,但是您也可以assert来确保。如果不是,您可能需要确保as_strided输出适用于n-d a数组。例如:

shape = a.shape[0] - window + 1, window, a.shape[-1]

应该是的

^{pr2}$

为了接受n-d输入。就引用坏内存而言,可能永远不会是个问题,但是如果维度更多,当前的shape将引用a中的错误数据。在

  1. 其次,创建的视图多次引用相同的数据块。如果然后对该视图进行并行写入(通过view = foobar( . . ., out = view)),结果可能是{a1},而且可能不是您期望的那样。在

也就是说,如果您害怕问题,并且不需要写入as_strided视图(因为在大多数卷积应用程序中通常不需要这样做),您可以始终将其设置为writable = False,这样即使您的strides和/或{}不正确,也可以防止这两个问题。在

编辑:正如@hpaulj所指出的,除了这两个问题之外,如果您对制作副本的view做了一些事情(比如.flatten()或者对其中的一大块进行了索引),那么它可能会导致MemoryError。在

相关问题 更多 >