我得到一个数组,如:
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
形状相同的数组,这样条目就是a
array_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
但是,这种方法仍然需要我遍历每个索引。我想提高效率。
答案 0 :(得分:2)
我认为这可以做你想要的。
以下是您的示例数据:
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]])