use*_*693 4 python numpy linear-algebra
我有一个三维数据集,我试图通过以下方式操作.
data.shape = (643, 2890, 10)
vector.shape = (643,)
Run Code Online (Sandbox Code Playgroud)
我想numpy将数据看作是一个长度为643的长度1-D数组的2890x10矩阵,并计算数据和向量之间的点积(sum-product?).我可以用循环来做这个,但是我真的想找到一种方法来使用原语(这将在并行节点上运行多次).
等效循环(我相信):
a = numpy.zeros ((2890, 10))
for i in range (643):
a += vector[i]*data[i]
Run Code Online (Sandbox Code Playgroud)
非常感谢!对不起,如果这是一个转贴,我搜索了很多,并最终建立帐户问你们.
a = numpy.array ([[[1,1,1,1],[2,2,2,2],[3,3,3,3]], [[3,3,3,3],[4,4,4,4],[5,5,5,5]]])
b = numpy.array ([10,20])
# Thus,
a.shape = (2,3,4)
b.shape = (2,)
# Want an operation . such that:
a . b = [[10,10,10,10],[20,20,20,20],[30,30,30,30]] + [[60,60,60,60],[80,80,80,80],[100,100,100,100]]
= [[70,70,70,70],[100,100,100,100],[130,130,130,130]]
Run Code Online (Sandbox Code Playgroud)
如果您的NumPy足够新(1.6或更高),您可以使用numpy.einsum:
result = np.einsum('ijk,i -> jk', data, vector)
Run Code Online (Sandbox Code Playgroud)
In [36]: data = np.array ([[[1,1,1,1],[2,2,2,2],[3,3,3,3]], [[3,3,3,3],[4,4,4,4],[5,5,5,5]]])
In [37]: vector = np.array ([10,20])
In [38]: np.einsum('ijk,i -> jk', data, vector)
Out[38]:
array([[ 70, 70, 70, 70],
[100, 100, 100, 100],
[130, 130, 130, 130]])
Run Code Online (Sandbox Code Playgroud)
或者,没有np.einsum,您可以添加额外的轴vector并利用广播来执行乘法:
In [64]: (data * vector[:,None,None]).sum(axis=0)
Out[64]:
array([[ 70, 70, 70, 70],
[100, 100, 100, 100],
[130, 130, 130, 130]])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1479 次 |
| 最近记录: |