2013-10-09 59 views
3

我有兩個numpy的數組:插入值按行的2D numpy的陣列

x = np.array([1,2,3,4,5]) 
y = np.array([10,20,30,40,50]) 

我試圖得到的是這樣的:

array([[ 1. , 3.25, 5.5 , 7.75, 10. ], 
     [ 2. , 6.5 , 11. , 15.5 , 20. ], 
     [ 3. , 9.75, 16.5 , 23.25, 30. ], 
     [ 4. , 13. , 22. , 31. , 40. ], 
     [ 5. , 16.25, 27.5 , 38.75, 50. ]]) 

我的做法是不是很NumPy的喜歡和需要改進(擺脫for循環)非常大的陣列:

myarray = np.zeros((5,5)) 
for idx in np.arange(5): 
    myarray[idx,:] = np.linspace(x[idx], y[idx], 5) 

什麼是一個很好的方法來做到這一點在Num PY? 以這種方式生成myarray然後操縱它會更好嗎?

myarray = np.zeros((5,5)) 
myarray[:,0] = x 
myarray[:,-1] = y 

array([[ 1., 0., 0., 0., 10.], 
     [ 2., 0., 0., 0., 20.], 
     [ 3., 0., 0., 0., 30.], 
     [ 4., 0., 0., 0., 40.], 
     [ 5., 0., 0., 0., 50.]]) 

回答

4

這種掛羊頭賣狗肉廣播作品:

>>> x = np.array([1,2,3,4,5]) 
>>> y = np.array([10,20,30,40,50]) 
>>> z = np.linspace(0, 1, 5) 
>>> z[None, ...] * (y[..., None] - x[..., None]) + (x[..., None]) 
array([[ 1. , 3.25, 5.5 , 7.75, 10. ], 
     [ 2. , 6.5 , 11. , 15.5 , 20. ], 
     [ 3. , 9.75, 16.5 , 23.25, 30. ], 
     [ 4. , 13. , 22. , 31. , 40. ], 
     [ 5. , 16.25, 27.5 , 38.75, 50. ]]) 
>>> 
1

這是使用np.nditer用於遍歷數組另一種解決方案:

>>> import numpy as np 
>>> n = 5 
>>> x = np.array([1,2,3,4,5]) 
>>> y = np.array([10,20,30,40,50]) 
>>> z = np.empty(shape=(n, x.shape[0]), dtype=float) 

>>> for k, (i,j) in enumerate(np.nditer([x,y])): 
     z[k,:] = np.linspace(i,j,n) 
>>> z 
[[ 1.  3.25 5.5 7.75 10. ] 
[ 2.  6.5 11. 15.5 20. ] 
[ 3.  9.75 16.5 23.25 30. ] 
[ 4. 13. 22. 31. 40. ] 
[ 5. 16.25 27.5 38.75 50. ]]