矩阵乘法Broadcas

2024-04-19 04:30:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由n3x3数组组成的数组(一个矩阵的集合,尽管数据类型是np.ndarray公司)我有一个由n3x1数组组成的数组(向量的集合)。我要做的是将每个矩阵乘以每个向量,所以我希望得到n3x1数组。在

简单示例:

A = np.ones((6,3,3))
B = np.ones((6,3,1))
np.dot(A,B) # This gives me a 6x3x6x1 array, which is not what I want
np.array(map(np.dot,A,B)) # This gives me exactly what I want, but I don't want to have to rely on map

我已经厌倦了各种各样的重塑,探索了einsum等等,但是不能让它按照我想要的方式工作。我怎样才能让这个和纽比广播公司合作?这个操作最终需要执行数千次,我不希望map或列表理解操作来减慢速度。在


Tags: tomapnpones矩阵数组thisarray
3条回答

可以使用^{}计算点积并创建所需形状的矩阵:

np.einsum('ijk,ikl->ijl', A, B)
A = np.random.rand(6, 3, 3)
B = np.random.rand(6, 3, 1)
C = np.array(map(np.dot, A, B))
D = np.sum(A*B.swapaxes(1, 2), axis=2)[..., None]
assert np.allclose(C, D)
assert C.shape == D.shape == (6, 3, 1)

“allclose”是因为这两种方法在1e-16量级上存在一些浮点舍入差异。在

.swapaxis和[…,None]只是为了使数组符合您指定的形状。您也可以用以下方式更简单地表示:

^{pr2}$

你可以使用Python3.5或更高版本中内置的矩阵乘法, 在PEP 465中引入。在

$ python  version
Python 3.6.6

>>> import numpy as np
>>> A = np.ones((6,3,3))
>>> B = np.ones((6,3,1))
>>> C = A @ B
>>> print(C)
[[[3.]
  [3.]
  [3.]]

 [[3.]
  [3.]
  [3.]]

 [[3.]
  [3.]
  [3.]]

 [[3.]
  [3.]
  [3.]]

 [[3.]
  [3.]
  [3.]]

 [[3.]
  [3.]
  [3.]]]

相关问题 更多 >