gpt4 book ai didi

python - 矢量化 - 添加没有循环的 numpy 数组?

转载 作者:行者123 更新时间:2023-11-28 16:24:12 26 4
gpt4 key购买 nike

所以我有以下 numpy 数组:

c = array([[ 1,  2,  3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
X = array([[10, 15, 20, 5],
[ 1, 2, 6, 23]])
y = array([1, 1])

我正在尝试将 X 数组中的每个 1x4 行添加到 c 中的列之一。 y 数组指定了哪一列。上面的示例意味着我们将 X 数组中的两行添加到 c 的 1 列。也就是说,我们应该期待以下结果:

     c = array([[ 1,  2+10+1,  3],  =  array([[ 1,  13,  3],
[ 4, 5+15+2, 6], [ 4, 22, 6],
[ 7, 8+20+6, 9], [ 7, 34, 9],
[10, 11+5+23, 12]]) [10, 39, 12]])

有谁知道我如何在没有任何循环的情况下做到这一点?我尝试了 c[:,y] += X 但它似乎只将 X 的第二行添加到 1 列>c 一次。话虽如此,需要注意的是,y不一定是[1,1],也可以是[0,1]。在这种情况下,我们将 X 的第一行添加到 c0 列和 X 的第二行> 到 c1 列。

最佳答案

当我看到您想要的计算时,我的第一个想法是对 X 的两行求和,并将其添加到 c 的第二列:

In [636]: c = array([[ 1,  2,  3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])

In [637]: c[:,1]+=X.sum(axis=0)

In [638]: c
Out[638]:
array([[ 1, 13, 3],
[ 4, 22, 6],
[ 7, 34, 9],
[10, 39, 12]])

但是如果我们想从像 y 这样的一般索引开始工作, 我们需要一个特殊的 bufferless操作 - 即如果 y 中有重复项:

In [639]: c = array([[ 1,  2,  3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])

In [641]: np.add.at(c,(slice(None),y),X.T)

In [642]: c
Out[642]:
array([[ 1, 13, 3],
[ 4, 22, 6],
[ 7, 34, 9],
[10, 39, 12]])

你需要查找.at在 numpy 文档中。

在 Ipython 中 add.at?向我展示了包含以下内容的文档:

Performs unbuffered in place operation on operand 'a' for elements specified by 'indices'. For addition ufunc, this method is equivalent to a[indices] += b, except that results are accumulated for elements that are indexed more than once. For example, a[[0,0]] += 1 will only increment the first element once because of buffering, whereas add.at(a, [0,0], 1) will increment the first element twice.

与不同y它仍然有效

In [645]: np.add.at(c,(slice(None),[0,2]),X.T)

In [646]: c
Out[646]:
array([[11, 2, 4],
[19, 5, 8],
[27, 8, 15],
[15, 11, 35]])

关于python - 矢量化 - 添加没有循环的 numpy 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37846676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com