我有相当大的数组来填充矩阵(大约 5e6 元素)。我知道快速填充的方法是类似
(简化示例)
bbb = (np.array([1,2,3,4,1])) # row
ccc = (np.array([0,1,2,1,0])) # column
ddd = (np.array([55.5,22.2,33.3,44.4,11.1])) # values
experiment = np.zeros(shape=(5,3))
experiment[bbb, ccc] = [ddd] # filling
>[[ 0. 0. 0. ]
[ 11.1 0. 0. ]
[ 0. 22.2 0. ]
[ 0. 0. 33.3]
[ 0. 44.4 0. ]]
但是如果我想要最大 ddd 的话。类似于 # filling
#pseudocode
experiment[bbb, ccc] = [ddd if ddd > experiment[bbb, ccc]]
矩阵应该返回
>[[ 0. 0. 0. ]
[ 55.5 0. 0. ]
[ 0. 22.2 0. ]
[ 0. 0. 33.3]
[ 0. 44.4 0. ]]
有什么快速的方法可以让 max 填充这里的 np.array 矩阵?
请您参考如下方法:
您可以使用 np.ufunc.at在 np.maximum .
np.ufunc.at 执行前面的 ufunc“无缓冲和就地”。这意味着 [bbb, ccc] 中出现的所有索引都将由 np.maximum 处理,无论这些索引出现的频率如何。
在你的例子中 (0, 1) 出现了两次,所以它会被处理两次,每次都选择 experiment[bbb, ccc] 和 中的最大值>ddd.
np.maximum.at(experiment, [bbb, ccc], ddd)
# array([[ 0. , 0. , 0. ],
# [ 55.5, 0. , 0. ],
# [ 0. , 22.2, 0. ],
# [ 0. , 0. , 33.3],
# [ 0. , 44.4, 0. ]])
