python - 如何有效地执行这个 numpy 数组操作?

标签 python arrays numpy array-broadcasting

给我一​​个数组,例如:

a = numpy.array([1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4])

我还得到了另一个数组,其中所有条目都大于或等于零且小于 a 的大小。一个例子:

array_index = numpy.array([[0, 0, 1, 2], [0, 1, 2, 2], [0, 1, 1, 3]])

array_index 基本上告诉我应该将 a 的元素堆叠到哪里。例如,array_index 的第一个条目 [0, 0, 1, 2] 告诉 a 的第一个条目的索引 0 元素应该保持不变,第二个索引 0 告诉 a 的索引 1 元素应该堆叠到索引 0,第三个索引 1 告诉 a 的索引 2 元素应该堆叠到索引 1,并且很快。 现在,我需要构造另一个与 my_array 形状相同的数组,以便条目是 aarray_index 处的相应索引值。在这种情况下我会先

array_desired = numpy.zeros(array_index.shape)

我会填写如下值:

array_desired = [[a[0]+a[1], a[2], a[3], 0], [a[0], a[1], a[2]+a[3], 0],
                 [a[0], a[1]+a[2], 0, a[3]]]

为此,作为第一种方法,我为第 0 个元素构造了以下内容:

stack_index = numpy.where(array_index == 0)
array_desired[stack_index] += a[stack_index]
print(array_desired)
>>> [[1 2 0 0] [1 0 0 0] [1 0 0 0]]

这是一些东西,但不完全是我想要的:

>>>[[3 0 0 0][1 0 0 0][1 0 0 0]] 

关于如何按照我上面描述的索引实现正确的堆叠有什么想法吗?

更新:

我现在有一个适用于第一个索引的方法:

temp_array = numpy.zeros(array_index.shape)
stack_index = numpy.where(array_index == 0)
temp_array[stack_index] = a[stack_index]
n = np.sum(temp_array, axis=(1))
array_desired[:,0]= n

但是,这个方法仍然需要我循环每个索引。我想要更有效率的东西。

最佳答案

我认为这符合你的要求。

这是您的示例数据:

In [98]: a
Out[98]: 
array([[1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4]])

In [99]: array_index
Out[99]: 
array([[0, 0, 1, 2],
       [0, 1, 2, 2],
       [0, 1, 1, 3]])

创建b来保存结果,并使用np.add.at进行求和。 row_index 只是 3x1 数组 [[0], [1], [2]]

In [100]: b = np.zeros_like(a)

In [101]: row_index = np.arange(array_index.shape[0]).reshape(-1, 1)

In [102]: np.add.at(b, (row_index, array_index), a)

In [103]: b
Out[103]: 
array([[3, 3, 4, 0],
       [1, 2, 7, 0],
       [1, 5, 0, 4]])

关于python - 如何有效地执行这个 numpy 数组操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50182502/

相关文章:

Python:将列表中字符串项的索引号附加到该项目

python - 转换为二进制有什么问题?

python - 使用 firefox 绕过弹出窗口 : Selenium Python 下载文件

arrays - 如何在javascript中交换多个数组的索引并创建一个新数组

arrays - 如何保持关联数组顺序?

python - 导入模块不起作用

JavaScript - 无法正确访问对象内的属性

python - 如何在 python 中有效地创建一个稀疏向量?

python - 使用最大日期字段和收入字段按类别进行新列计算

python - 如何在 Python 中矢量化点积?