将向量数组与矩阵相乘,不进行for循环



我有一个2 x 2numpy.array()matrix和一个数组N x 2X,包含N二维向量。

我想用X中的每个向量乘以2 x 2矩阵。下面我使用for循环,但我确信有更快的方法。谁能告诉我这是什么?我认为有一种方法使用numpy函数。

# the matrix I want to multiply X by
matrix = np.array([[0, 1], [-1, 0]]) 
# initialize empty solution
Y = np.empty((N, 2))
# loop over each vector in X and create a new vector Y with the result
for i in range(0, N):
Y[i] = np.dot(matrix, X[i]) 

例如:

matrix = np.array([
[0,  1],
[0, -1]
])
X = np.array([
[0, 0],
[1, 1],
[2, 2]
])

应该导致:

Y = np.array([
[0,  0],
[1, -1],
[2, -2]
])

一行就是(matrix @ X.T).T

就是对X进行转置,得到列向量。那么matrix @ X.T或(np.dot(matrix, X.T)如果你喜欢这个解决方案,但现在@符号存在,为什么不使用它)是由矩阵的列乘以X[i]组成的矩阵。如果您需要Y由结果行组成

,只需将结果反置即可。
matrix = np.array([[0, 1], [-1, 0]]) 
X = np.array([[1,2],[3,4],[5,6]])
Y = (matrix @ X.T).T

Y

array([[ 2, -1],
[ 4, -3],
[ 6, -5]])

如我所料。


Xis
array([[1, 2],
[3, 4],
[5, 6]])

所以X.T

array([[1, 3, 5],
[2, 4, 6]])

所以,你可以用2x2矩阵乘以这个2x3矩阵,结果将是一个2x3矩阵,它的列是matrix乘以这个的列的结果。matrix @ X.T

array([[ 2,  4,  6],
[-1, -3, -5]])

然后把这个转置回去得到已经给出的结果。

所以,tl;dr:一行的答案是(matrix @ X.T).T

您正在使用(2,2)矩阵和每个(2,1)X行进行某种矩阵乘法。你需要让所有的向量具有相同的维数来直接计算这个。添加一个维度为None,并像这样直接计算Y:

matrix = np.array([[3, 1], [-1, 0.1]]) 
N = 10
Y = np.empty((N, 2))
X =np.ones((N,2))
X[0][0] = 2
X[5][1] = 3
# loop over each vector in X and create a new vector Y with the result
for i in range(0, N):
Y[i] = np.dot(matrix, X[i])
Ydirect = matrix[None,:] @ X[:,:,None]
print(Y)
print(Ydirect[:,:,0])

您可以向量化Adrien的结果并删除for循环,这将优化性能,特别是当矩阵变得更大时。

matrix = np.array([[3, 1], [-1, 0.1]])
N = 10
X = np.ones((N, 2))
X[0][0] = 2
X[5][1] = 3
# calculate dot product using @ operator
Y = matrix @ X.T

print(Y)