numpy:布尔索引和内存使用情况

时间:2011-05-11 09:19:27

标签: python numpy memory-management large-data

考虑以下numpy代码:

A[start:end] = B[mask]

下面:

  • AB是具有相同列数的2D数组;
  • startend是标量;
  • mask是一维布尔数组;
  • (end - start) == sum(mask)

原则上,可以使用O(1)临时存储执行上述操作,方法是将B的元素直接复制到A

这是实际发生的事情,还是numpyB[mask]构建临时数组?如果是后者,有没有办法通过重写语句来避免这种情况?

2 个答案:

答案 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扩展来处理它。