这里是我需要为Numpy矩阵的每个元素计算的公式:
Mi_j = Sum_v(Av * Xi_v) + Sum_v(Bv * Wj_v) + Sum_v(Gv * Zij_v)
我不太清楚如何用numpy的方式编写它(在python中太长了):矢量化/切片/C API。
你有什么建议,能给我一个简单的例子吗?我对numpy很新。
@编辑索引
- A、B、G是一维数组[x,x,x] - Xi和Wj也是如此(X是一个矩阵,W是一个矩阵) - Zij是一个一维数组
这里是我需要为Numpy矩阵的每个元素计算的公式:
Mi_j = Sum_v(Av * Xi_v) + Sum_v(Bv * Wj_v) + Sum_v(Gv * Zij_v)
matrix
类将更容易将数学转换为代码,反之亦然。Mi_j = Sum_v(Av * Xi_v) + Sum_v(Bv * Wj_v) + Sum_v(Gv * Zij_v)
M = X*A + (W*B).T + Z*G
如果您将每个矩阵初始化为np.matrix
,适当的代数运算会自动完成。
import numpy as np
N = 5
A = np.asmatrix(np.arange(N)).T
B = np.asmatrix(np.arange(N)).T
G = np.asmatrix(np.arange(N)).T
X = np.asmatrix(np.arange(N*N).reshape(N,N))
W = np.asmatrix(np.arange(N*N).reshape(N,N))
Z = np.asmatrix(np.arange(N**3).reshape(N,N,N))
M = X*A + (W*B).T + Z*G
print M
[[ 90 190 290 390 490]
[ 390 490 590 690 790]
[ 690 790 890 990 1090]
[ 990 1090 1190 1290 1390]
[1290 1390 1490 1590 1690]]
让我们通过一个简单的例子来进行说明:
如果我们定义:
import numpy as np
N = 5
A = np.arange(N)
X = np.arange(N*N).reshape(N,N)
B = np.arange(N)
W = np.arange(N*N).reshape(N,N)
G = np.arange(N)
Zij = np.arange(N)
那么第一个和,Sum_v(Av * Xi_v)
可以使用 np.dot
计算:
In [54]: X
Out[54]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
In [55]: A
Out[55]: array([0, 1, 2, 3, 4])
In [56]: np.dot(X, A)
Out[56]: array([ 30, 80, 130, 180, 230])
Sum_v(Bv * Wj_v)
可以计算为:In [58]: np.dot(W,B)
Out[58]: array([ 30, 80, 130, 180, 230])
i
索引变化的向量,而我们希望第二项求和结果是一个沿着j
索引变化的向量。为了在numpy中实现这一点,使用广播:In [59]: np.dot(X,A) + np.dot(W,B)[:,None]
Out[59]:
array([[ 60, 110, 160, 210, 260],
[110, 160, 210, 260, 310],
[160, 210, 260, 310, 360],
[210, 260, 310, 360, 410],
[260, 310, 360, 410, 460]])
In [60]: np.dot(Zij, G)
Out[60]: 30
In [61]: M = np.dot(X,A) + np.dot(W,B)[:,None] + np.dot(Zij, G)
In [62]: M
Out[62]:
array([[ 90, 140, 190, 240, 290],
[140, 190, 240, 290, 340],
[190, 240, 290, 340, 390],
[240, 290, 340, 390, 440],
[290, 340, 390, 440, 490]])
Zij
的含义。虽然您说它是一个一维数组,但也许您的意思是对于每个i,j
,它都是一个一维数组。那么Z
将是三维的。Z
的前两个轴表示i
和j
索引,而Z
的最后一个轴是您想要求和的轴。np.dot(Z, G)
:In [13]: Z = np.arange(N**3).reshape(N,N,-1)
In [14]: np.dot(X,A) + np.dot(W,B)[:,None] + np.dot(Z, G)
Out[14]:
array([[ 90, 190, 290, 390, 490],
[ 390, 490, 590, 690, 790],
[ 690, 790, 890, 990, 1090],
[ 990, 1090, 1190, 1290, 1390],
[1290, 1390, 1490, 1590, 1690]])
None
作为 newaxis
的原因是什么呢?(非常好的答案,无论如何加上一票) - ev-brZ_ij
对于所有的i
和j
都是常数,但一般情况下并非如此。 - askewchanZ = np.asmatrix(...reshape(N,N,N))
会抛出一个ValueError
。 - unutbu
u
也是一个索引吗? - askewchanX
和W
是否作为完整矩阵,Z
是否作为完整的三维数组,如公式所假设的那样,还是像最后列出的Xi
、Wj
和Zij
一样作为1d数组?我的答案允许完整的数组。 - askewchan