Skip to main content
 首页 » 编程设计

python之从 np.array 的行索引、列索引和最大值(值)填充矩阵的快速方法

2025年05月04日21xing901022

我有相当大的数组来填充矩阵(大约 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. ]])