^{
这个问题源于.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)解释为什么或者为什么不以其他方式使用不同数据类型和跨距的等效数组在上述结果中会产生不同的结果。在
否,
as_strided
的警告是针对两个与数据大小无关的问题,以及写入结果视图的结果。在view = as_strided(a . . . )
只有指向a
中的内存。这就是为什么在调用as_strided
之前要进行如此多的精心准备工作。如果您的算法是关闭的,您可以轻松地让您的view
指向不在a
中的内存,该内存可能确实是针对垃圾、其他变量或操作系统的。如果您随后写入该视图,您的数据可能会丢失、放错位置、损坏。或者让你的电脑崩溃。在对于您的特定示例,它的安全性在很大程度上取决于您使用的是什么输入。您已经用
a.strides
设置了strides
,因此这是动态的。你可能想assert
的dtype
不是什么奇怪的东西object
。在如果您确定您将始终拥有大于
window
的二维a
,那么您可能对您的算法很满意,但是您也可以assert
来确保。如果不是,您可能需要确保as_strided
输出适用于n-da
数组。例如:应该是的
^{pr2}$为了接受n-d输入。就引用坏内存而言,可能永远不会是个问题,但是如果维度更多,当前的
shape
将引用a
中的错误数据。在view = foo
或bar( . . ., out = view)
),结果可能是{a1},而且可能不是您期望的那样。在也就是说,如果您害怕问题,并且不需要写入}不正确,也可以防止这两个问题。在
as_strided
视图(因为在大多数卷积应用程序中通常不需要这样做),您可以始终将其设置为writable = False
,这样即使您的strides
和/或{编辑:正如@hpaulj所指出的,除了这两个问题之外,如果您对制作副本的
view
做了一些事情(比如.flatten()
或者对其中的一大块进行了索引),那么它可能会导致MemoryError
。在相关问题 更多 >
编程相关推荐