我有以下练习。给定 3x4 矩阵中的一组坐标:
coord = np.array([
[2,3],
[0,1],
[2,2],
[2,3],
[1,1],
[2,3],
[1,1]
])
给定一个 3x4 矩阵总计,初始设置所有条目都等于 0,我想按以下数量对每个单元格中的所有金额求和:
amounts = np.array([0.5,1.1,0.2,0.9,1.3,0.4,2.0])
例如:
total[2,3] = 0.5 + 0.9 + 0.4 = 1.8
.
我做了以下代码:
x = coord[:,0]
y = coord[:,1]
total = np.zeros((3,4))
for i in range(len(amounts)):
total[x[i], y[i]] = total[x[i], y[i]] + amounts[i]
可以通过使用 Numpy 向量化或函数进一步改进吗?也许在某种程度上对于较大的数据集特别有用。
您可以使用
total
函数,而不是使用循环来更新 np.add.at
矩阵。
import numpy as np
coord = np.array([
[2,3],
[0,1],
[2,2],
[2,3],
[1,1],
[2,3],
[1,1],
])
amounts = np.array([0.5,1.1,0.2,0.9,1.3,0.4,2.0])
# create an empty total metrix
total = np.zeros((3,4))
# use np.add.at for in-place accumulation
np.add.at(total, (coord[:,0], coord[:,1]), amounts)
print(total)
说明:
np.add.at
:此函数允许您累积指定索引处的值而不覆盖它们。它需要三个参数:要更新的数组、发生更新的索引以及要添加的值。coord[:,0]
和 coord[:,1]
作为索引,您可以指定要直接更新的行和列。