7

考虑以下numpy代码:

A[start:end] = B[mask]

这里:

  • A并且B是具有相同列数的二维数组;
  • start并且end是标量;
  • mask是一维布尔数组;
  • (end - start) == sum(mask).

原则上,上述操作可以使用O(1)临时存储进行,通过将元素B直接复制到A.

这是在实践中实际发生的情况,还是numpy为 构造了一个临时数组B[mask]?如果是后者,有没有办法通过重写语句来避免这种情况?

4

2 回答 2

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) 额外的内存。另请注意,itertools.compress()它在 Python 2.7 或 3.1 或更高版本中可用。

于 2011-05-11T09:53:32.237 回答
2

使用布尔数组作为索引是一种花哨的索引,因此 numpy 需要进行复制。如果您遇到内存问题,您可以编写一个 cython 扩展来处理它。

于 2011-05-11T09:52:28.877 回答