不,警告
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]
应该是
shape = (a.shape[0] - window + 1, window) + a.shape[1:]
为了接受nd输入。就引用坏内存而言,这 可能 永远不会成为问题,但是如果您有更大的维度,则当前
shape将引用错误的数据
a。
- 其次,创建的视图多次引用相同的数据块。如果您随后对该视图进行并行写入(通过
view = foo
或bar( . . ., out = view)
),则结果可能是不可预测的,并且可能不是您所期望的。
就是说,如果您担心问题并且不需要写入
as_strided视图(因为对于大多数常用的卷积应用程序而言,您不需要这样做),则可以始终将其设置为
writable= False,即使出现这种情况也可以避免这两个问题您
strides和/或
shape不正确。
编辑:
正如@hpaulj所指出的那样,除了这两个问题外,如果您对
view进行复制的操作(像是
.flatten()花哨的索引很大一部分),则可能导致
MemoryError。



