设x,y为N个元素的两个numpy数组 . 我想创建一个numpy矩阵,其列是x的缩放版本 . 例如,说
m=[0.2, 0.4, 1.2]
然后我想要矩阵
X = [0.2x y,0.4x y,1.2x y]
什么是最快(最简单,最简单的第二优先)方式 .
目前我正在做这样的事情 .
ListVec = [m[i]*x+y for i in numpy.arange(len(m))] X = numpy.array(ListVec).T
import numpy as np m = np.array([0.2, 0.4, 1.2]) x = 5 y = 3 X = m*x+y
这在numpy中称为broadcasting(既简单又快速;))
如果X和Y是数组,则使用Einstein Summation
In [70]: Y Out[76]: array([5, 6, 7, 8, 9]) In [71]: X Out[71]: array([0, 1, 2, 3, 4]) In [72]: m Out[72]: [0.2, 0.4, 1.2] In [73]: np.einsum('i,j', X, m) Out[73]: array([[0. , 0. , 0. ], [0.2, 0.4, 1.2], [0.4, 0.8, 2.4], [0.6, 1.2, 3.6], [0.8, 1.6, 4.8]]) In [74]: Y[...,np.newaxis] + np.einsum('i,j', X, m) Out[74]: array([[ 5. , 5. , 5. ], [ 6.2, 6.4, 7.2], [ 7.4, 7.8, 9.4], [ 8.6, 9.2, 11.6], [ 9.8, 10.6, 13.8]])
如果您给出示例 x 和 y 以及 m ,它会有所帮助,但是:
x
y
m
In [435]: x,y = np.array([1,2,3,4]), np.array([.1,.2,.3,.4]) In [436]: m = [.2,.4,1.2]
结果是(3,N):
In [437]: np.array([i*x+y for i in m]) Out[437]: array([[0.3, 0.6, 0.9, 1.2], [0.5, 1. , 1.5, 2. ], [1.3, 2.6, 3.9, 5.2]])
广播 m :
In [438]: np.array(m)[:,None]*x + y Out[438]: array([[0.3, 0.6, 0.9, 1.2], [0.5, 1. , 1.5, 2. ], [1.3, 2.6, 3.9, 5.2]])
哎呀,我错过了你的转置,
In [440]: np.array(m)*x[:,None] + y[:,None] Out[440]: array([[0.3, 0.5, 1.3], [0.6, 1. , 2.6], [0.9, 1.5, 3.9], [1.2, 2. , 5.2]])
我继续将转置应用于[438]
3 回答
这在numpy中称为broadcasting(既简单又快速;))
如果X和Y是数组,则使用Einstein Summation
如果您给出示例
x
和y
以及m
,它会有所帮助,但是:结果是(3,N):
广播
m
:哎呀,我错过了你的转置,
我继续将转置应用于[438]