让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
答案 0 :(得分:3)
import numpy as np
m = np.array([0.2, 0.4, 1.2])
x = 5
y = 3
X = m*x+y
这在numpy中被称为broadcasting(既方便又快速;))
答案 1 :(得分:2)
在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]])
答案 2 :(得分:1)
如果您提供示例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]