python矩阵元素_python–计算矩阵的每个元素以下是我必须为Numpy矩阵的每个元素计算的公式:
Mi_j = Sum_v(Av * Xi_v) + Sum_v(Bv * Wj_v) + Sum_v(Gv * Zij_v)
我真的没有看到如何以⼀种笨拙的⽅式对它进⾏编码(在python中太长了):vectorized /切⽚/ C Api.
你会建议什么,你能给我⼀个简单的例⼦吗?我是numpy的新⼿.
@Edited指数
> A,B,G是⼀维[x,x,x]的数组
> Xi和Wj相同(X是矩阵,W是矩阵)
> Zij是⼀个维度的数组
解决⽅法:
让我们通过⼀个简单的例⼦来解决:
如果我们定义:
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)
然后可以⽤np.dot计算第⼀个和Sum_v(Av * Xi_v):
In [54]: X
Out[54]:
array([[ 0, 1, 2, 3, 4],
python 定义数组[ 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-index变化的向量,⽽我们希望第⼆个和产⽣⼀个沿着j-index变化的向量.要安排在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-indices,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]])
标签:python,matrix,numpy,linear-algebra
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论