考虑以下numpy
代码:
A[start:end] = B[mask]
下面:
A
和B
是具有相同列数的2D数组; start
和end
是标量; mask
是一维布尔数组; (end - start) == sum(mask)
。原则上,可以使用O(1)
临时存储执行上述操作,方法是将B
的元素直接复制到A
。
这是实际发生的事情,还是numpy
为B[mask]
构建临时数组?如果是后者,有没有办法通过重写语句来避免这种情况?
答案 0 :(得分:3)
该行
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)额外的内存。另请注意,{2.7}或3.1或更高版本中提供了itertools.compress()
。
答案 1 :(得分:2)
使用布尔数组作为索引是花哨的索引,因此numpy需要复制。 如果你遇到内存问题,你可以编写一个cython扩展来处理它。