我正在使用np.dot()在NumPy中进行矩阵乘法。由于数据集非常大,我希望尽可能缩短整体运行时间 - 即尽可能少地执行np.dot()产品。
具体来说,我需要计算整个矩阵乘积以及来自我的值向量的每个元素的相关流量。 在NumPy中有一种方法可以在一个或两个np.dot()产品中一起计算所有这些吗? 在下面的代码中,有没有办法减少np.dot()产品的数量,仍然得到相同的输出?
import pandas as pd
import numpy as np
vector = pd.DataFrame([1, 2, 3],
['A', 'B', 'C'], ["Values"])
matrix = pd.DataFrame([[0.5, 0.4, 0.1],
[0.2, 0.6, 0.2],
[0.1, 0.3, 0.6]],
index = ['A', 'B', 'C'], columns = ['A', 'B', 'C'])
# Can the number of matrix multiplications in this part be reduced?
overall = np.dot(vector.T, matrix)
from_A = np.dot(vector.T * [1,0,0], matrix)
from_B = np.dot(vector.T * [0,1,0], matrix)
from_C = np.dot(vector.T * [0,0,1], matrix)
print("Overall:", overall)
print("From A:", from_A)
print("From B:", from_B)
print("From C:", from_C)
答案 0 :(得分:2)
如果用于选择行的向量确实是单位向量,那么最好不要对$resolved
,from_A
,from_B
进行矩阵乘法。矩阵乘法需要更多的加法和乘法,而不是将矩阵的每一行乘以它在矢量中的相应条目:
from_C
您只需拨打一次from_ABC = matrix.values * vector.values
即可获得np.dot
。
答案 1 :(得分:1)
您可以定义这些缩放值的3 x 3
形状2D
数组并执行矩阵乘法,如下所示 -
scale = np.array([[1,0,0],[0,1,0],[0,0,1]])
from_ABC = np.dot(vector.values.ravel()*scale,matrix)
示例运行 -
In [901]: from_A
Out[901]: array([[ 0.5, 0.4, 0.1]])
In [902]: from_B
Out[902]: array([[ 0.9, 1.6, 0.5]])
In [903]: from_C
Out[903]: array([[ 0.8, 1.3, 1.9]])
In [904]: from_ABC
Out[904]:
array([[ 0.5, 0.4, 0.1],
[ 0.9, 1.6, 0.5],
[ 0.8, 1.3, 1.9]])
以下是np.einsum
的替代方案,可以一步完成所有这些操作 -
np.einsum('ij,ji,ik->jk',vector.values,scale,matrix)
示例运行 -
In [915]: np.einsum('ij,ji,ik->jk',vector.values,scale,matrix)
Out[915]:
array([[ 0.5, 0.4, 0.1],
[ 0.9, 1.6, 0.5],
[ 0.8, 1.3, 1.9]])