Bra*_*mon 11 python arrays numpy python-3.x
结果会numpy.lib.stride_tricks.as_strided取决于NumPy数组的dtype吗?
这个问题来自于定义.strides,即
遍历数组时每个维度中的字节元组.
在这里使用我在其他问题中使用的以下功能.它需要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)
Run Code Online (Sandbox Code Playgroud)
由于进步的定义,因为,例如,的D类的其他等效的阵列float32,并float64会有不同的步伐,将这个不断炸掉我的rwindows功能上面?
我试过测试,但它一直是一种非详尽的方式,我正在寻找一个答案,(1)解释功能文档中的免责声明/警告是否与我在这里要求的内容有关,(2)解释为什么或为什么不具有不同的dtypes和strides的等效数组在上面会产生不同的结果.
不,警告as_strided是针对两个与数据大小无关的问题,而这两个问题更多地来自写入结果视图。
view = as_strided(a . . . ) 只有点记忆a。这就是为什么在致电之前要进行如此多的准备工作的原因as_strided。如果您的算法已关闭,则可以轻松地将指针view指向不位于中的内存a,并且确实可以将其指向垃圾,其他变量或您的操作系统。如果随后写入该视图,则数据可能会丢失,放错位置或损坏。。。或使您的计算机崩溃。对于您的特定示例,它的安全性在很大程度上取决于您所使用的输入。您已设置strides,a.strides因此它是动态的。您可能需要assert的dtype的a是不奇怪的事情一样object。
如果确定始终具有a大于的2-d ,则window算法可能会很好,但也可以assert确保。如果不是,则可能要确保as_strided输出适用于nd a数组。例如:
shape = a.shape[0] - window + 1, window, a.shape[-1]
Run Code Online (Sandbox Code Playgroud)
应该是
shape = (a.shape[0] - window + 1, window) + a.shape[1:]
Run Code Online (Sandbox Code Playgroud)
为了接受nd输入。就引用坏内存而言,这可能永远不会成为问题,但是如果您有更大的维度,则当前shape将引用错误的数据a。
view = foo或bar( . . ., out = view)),则结果可能无法预测,并且可能不是您所期望的。就是说,如果您担心问题并且不需要写入as_strided视图(因为对于大多数常用的卷积应用程序而言,您不必这样做),则可以始终将其设置为writable = False,即使出现这种情况也可以避免这两个问题您strides和/或shape不正确。
编辑:正如@hpaulj所指出的那样,除了这两个问题外,如果您对view进行复制的操作(像是.flatten()花哨的索引很大一部分),则可能导致MemoryError。
| 归档时间: |
|
| 查看次数: |
335 次 |
| 最近记录: |