【发布时间】:2018-01-22 22:57:25
【问题描述】:
numpy.lib.stride_tricks.as_strided 的结果会依赖于 NumPy 数组的 dtype 吗?
这个问题源于.strides的定义,即
遍历数组时要在每个维度中步进的字节元组。
使用我在其他问题中使用的以下函数。它采用一维或二维数组并创建长度为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 和 float64 的等效数组将具有不同的步幅,这是否会炸毁我上面的 rwindows 函数?
我尝试过测试,但它的方式并不详尽,我正在寻找一个答案,即 (1) 解释函数文档中的免责声明/警告是否与我在这里的问题有关,并且(2) 解释了为什么或为什么不具有不同 dtypes & strides 的等价数组会在上面产生不同的结果。
【问题讨论】:
-
我发现了两个问题。如果形状不正确,您最终可能会“跨过”缓冲区的末端。没有任何保障措施可以确保所有索引值都有效。其次,跨步数组上的许多操作都会进行复制。该副本可能比原始数组或跨步视图大得多;对于多维跨步(2 或 3d 窗口)尤其如此。
-
嗯。看起来该功能已经足够流行,以至于他们现在正在记录它。
标签: python arrays python-3.x numpy