首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy中的线性代数

Numpy中的线性代数
EN

Stack Overflow用户
提问于 2016-10-31 15:28:21
回答 2查看 509关注 0票数 2

我正在使用NumPy ()处理NumPy中的矩阵乘法。由于数据集非常大,我希望尽可能减少总体运行时间--即执行尽可能少的np.dot()产品。

具体来说,我需要从我的值向量的每个元素中计算整体矩阵积以及相关的流。在NumPy中是否有一种方法可以在一个或两个np.dot()产品中一起计算所有这些?在下面的代码中,是否有一种方法可以减少np.dot()产品的数量而仍然得到相同的输出?

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-31 15:39:55

您可以定义那些缩放值的3 x 3形状的2D数组并执行矩阵乘法,就像这样-

代码语言:javascript
复制
scale = np.array([[1,0,0],[0,1,0],[0,0,1]])
from_ABC = np.dot(vector.values.ravel()*scale,matrix)

样本运行-

代码语言:javascript
复制
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的另一种选择,只需一步就可以完成所有这些-

代码语言:javascript
复制
np.einsum('ij,ji,ik->jk',vector.values,scale,matrix)

样本运行-

代码语言:javascript
复制
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]])
票数 1
EN

Stack Overflow用户

发布于 2016-10-31 16:13:13

如果用于选择行的向量确实是单位向量,那么对于from_Afrom_Bfrom_C,您最好根本不做矩阵乘法。矩阵乘法所需的加法和乘法比只将矩阵的每一行乘以向量中的对应条目所需的要多得多:

代码语言:javascript
复制
from_ABC = matrix.values * vector.values

您只需要一个对np.dot的调用就可以得到overall

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40345334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档