有没有办法通过使用 Numpy 向量化来改进我的解决方案?

问题描述 投票:0回答:1

我有以下练习。给定 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 向量化或函数进一步改进吗?也许在某种程度上对于较大的数据集特别有用。

python numpy vectorization
1个回答
0
投票

您可以使用

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)

说明:

  1. np.add.at
    :此函数允许您累积指定索引处的值而不覆盖它们。它需要三个参数:要更新的数组、发生更新的索引以及要添加的值。
  2. 索引: 通过传递
    coord[:,0]
    coord[:,1]
    作为索引,您可以指定要直接更新的行和列。
© www.soinside.com 2019 - 2024. All rights reserved.