考虑以下numpy
代码:
A[start:end] = B[mask]
这里:
A
并且B
是具有相同列数的二维数组;start
并且end
是标量;mask
是一维布尔数组;(end - start) == sum(mask)
.
原则上,上述操作可以使用O(1)
临时存储进行,通过将元素B
直接复制到A
.
这是在实践中实际发生的情况,还是numpy
为 构造了一个临时数组B[mask]
?如果是后者,有没有办法通过重写语句来避免这种情况?
考虑以下numpy
代码:
A[start:end] = B[mask]
这里:
A
并且B
是具有相同列数的二维数组;start
并且end
是标量;mask
是一维布尔数组;(end - start) == sum(mask)
.原则上,上述操作可以使用O(1)
临时存储进行,通过将元素B
直接复制到A
.
这是在实践中实际发生的情况,还是numpy
为 构造了一个临时数组B[mask]
?如果是后者,有没有办法通过重写语句来避免这种情况?
线
A[start:end] = B[mask]
将 - 根据 Python 语言定义 - 首先评估右侧,产生一个包含所选行B
并占用额外内存的新数组。我知道避免这种情况的最有效的纯 Python 方法是使用显式循环:
from itertools import izip, compress
for i, b in izip(range(start, end), compress(B, mask)):
A[i] = b
当然,这比原始代码的时间效率要低得多,但它只使用 O(1) 额外的内存。另请注意,itertools.compress()
它在 Python 2.7 或 3.1 或更高版本中可用。
使用布尔数组作为索引是一种花哨的索引,因此 numpy 需要进行复制。如果您遇到内存问题,您可以编写一个 cython 扩展来处理它。