【问题标题】:How to improve the efficiency of array operation on the index view of a `numpy` array?如何提高对“numpy”数组的索引视图进行数组操作的效率?
【发布时间】:2018-05-09 14:31:41
【问题描述】:

以下是从A 计算数组B 的示例代码:

import numpy as np
idx1 = np.array([
 [3, 0, 0],
 [2, 1, 0],
 [2, 0, 1],
 [1, 2, 0],
 [1, 1, 1],
 [1, 0, 2],
 [0, 3, 0],
 [0, 2, 1],
 [0, 1, 2],
 [0, 0, 3]])
idx2 = np.arange(3)
A = np.arange(10*4*3).reshape(10, 4, 3)
B = np.prod(A[:, idx1, idx2], axis=2)

注意这一行

B = np.prod(A[:, idx1, idx2], axis=2)

这行内存有效吗?还是numpy 会为A[:, idx1, idx2] 生成一些内部数组?

可以想象,如果len(A) 非常大,而numpyA[:, idx1, idx2] 生成一些内部数组,则内存效率不高。有没有更好的方法来做这样的事情?

【问题讨论】:

  • 你真的是内存不足了吗?如果有,你有多少内存,你的实际数据是什么形状?
  • @JohnZwinck 事实上,我并没有耗尽内存。我只是好奇是否有更好的方法来做到这一点。

标签: python arrays numpy


【解决方案1】:

此表达式由 Python 解释器解析和评估:

B = np.prod(A[:, idx1, idx2], axis=2)

首先是

temp = A[:, idx1, idx2]   # expands to:
temp = A.__getitem__(slice(None), idx1, idx2)

由于idx1idx2 是数组,因此这是advanced indexing,而temp 是副本,而不是视图。

接下来执行解释:

np.prod(temp, axis=2)

也就是说,它将临时数组传递给prod函数,然后该函数返回一个数组,该数组分配给B变量。

我不知道prod 做了多少缓冲。我可以想象它设置了一个nditer(c-api 版本),它采用两个操作数数组,temp 和正确形状的输出(temp.shape(:-1) 假设总和在temp 的最后一个维度上) .请参阅我在The `out` arguments in `numpy.einsum` can not work as expected 中引用的文档的reduction 部分。

总之,Python 在计算函数时,首先计算所有参数,然后将它们传递给函数。使用生成器可以延迟对列表的评估,但 numpy 数组没有等价物。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 2021-07-06
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2018-05-02
    相关资源
    最近更新 更多