gpt4 book ai didi

python - numpy 向量运算

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:18 25 4
gpt4 key购买 nike

我有三个 numpy 数组:

X:3073 x 49000 矩阵
W:10 x 3073 矩阵
y:一个 49000 x 1 向量

y 包含 0 到 9 之间的值,每个值代表 W 中的一行。

我想将 X 的第一列添加到 W 中由 y 中的第一个元素给出的行。 IE。如果 y 中的第一个元素是 3,则将 X 的第一列添加到 W 的第四行。然后将 X 的第二列添加到 y 中第二个元素给出的 W 中的行,依此类推,直到 的所有列code>X已经添加到y指定的W中的行,即总共添加了49000行。

W[y] += X.T 对我不起作用,因为这不会向 W 中的一行添加多个向量。

请注意:我只是在寻找矢量化 解决方案。 IE。没有 for 循环。

编辑:为了澄清,我将添加一个小矩阵大小的示例,该示例改编自下面萨尔瓦多·达利的示例。

In [1]: import numpy as np

In [2]: a, b, c = 3, 4, 5

In [3]: np.random.seed(0)

In [4]: X = np.random.randint(10, size=(b,c))

In [5]: W = np.random.randint(10, size=(a,b))

In [6]: y = np.random.randint(a, size=(c,1))

In [7]: X
Out[7]:
array([[5, 0, 3, 3, 7],
[9, 3, 5, 2, 4],
[7, 6, 8, 8, 1],
[6, 7, 7, 8, 1]])

In [8]: W
Out[8]:
array([[5, 9, 8, 9],
[4, 3, 0, 3],
[5, 0, 2, 3]])

In [9]: y
Out[9]:
array([[0],
[1],
[1],
[2],
[0]])

In [10]: W[y.ravel()] + X.T
Out[10]:
array([[10, 18, 15, 15],
[ 4, 6, 6, 10],
[ 7, 8, 8, 10],
[ 8, 2, 10, 11],
[12, 13, 9, 10]])

In [11]: W[y.ravel()] = W[y.ravel()] + X.T

In [12]: W
Out[12]:
array([[12, 13, 9, 10],
[ 7, 8, 8, 10],
[ 8, 2, 10, 11]])

问题是同时将X中的第0列和第4列添加到W中的第0行,以及将X中的第1列和第2列添加到W中的第1行。

因此,期望的结果是:

W = [[17, 22, 16, 16],
[ 7, 11, 14, 17],
[ 8, 2, 10, 11]]

最佳答案

首先作为引用的直接循环解决方案:

In [65]: for i,j in enumerate(y):
W[j]+=X[:,i]
....:

In [66]: W
Out[66]:
array([[17, 22, 16, 16],
[ 7, 11, 14, 17],
[ 8, 2, 10, 11]])

add.at 解决方案:

In [67]: W=W1.copy()
In [68]: np.add.at(W,(y.ravel()),X.T)
In [69]: W
Out[69]:
array([[17, 22, 16, 16],
[ 7, 11, 14, 17],
[ 8, 2, 10, 11]])

add.at 进行无缓冲计算,绕过阻止 W[y.ravel()] += X.T 工作的缓冲。它仍然是迭代的,但循环已移至编译代码。这不是真正的矢量化,因为应用程序的顺序很重要。添加一行 X.T 取决于前几行的结果。

https://stackoverflow.com/a/20811014/901925是几年前我对类似问题(对于一维数组)的回答。

但是在处理大型阵列时:

X: a 3073 x 49000 matrix
W: a 10 x 3073 matrix
y: a 49000 x 1 vector

这可能会遇到速度问题。请注意,W[y.ravel()]X.T 大小相同(为什么选择这些需要转置的大小?)。它是一个副本,而不是 View 。所以已经有时间惩罚。

bincount 之前的问题都提示过,我觉得比较快。 Making for loop with index arrays faster (bincount 和 add.at 解决方案)

在较小的 3073 维度上迭代也可能具有速度优势。或如 Divakar 所示,在 10 维尺寸上更好。


对于小型测试用例,a,b,c=3,4,5add.at 解决方案最快,Divakar 的 code> bincounteinseum 接下来。对于较大的 a,b,c=10,1000,20000add.at 变得非常慢,而 bincount 是最快的。

相关SO答案

https://stackoverflow.com/a/28205888/901925 (注意 bincount 需要完全覆盖 y)。

https://stackoverflow.com/a/30041823/901925 (其中 Divakar 再次表明 bincount 规则!)

关于python - numpy 向量运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32283082/

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