2012-11-11 37 views
1

我是一名Python初学者。我想知道是否有一个“好”的方法来做这个操作,而不使用for循环。 考虑的问题numpy中二维数组的选定元素的矢量化赋值语句

u = zeros((4,2)) 
u_pres = array([100,200,300]) 
row_col_index = array([[0,0,2], [0,1,1]]) 

我想分配U [0,0],U [0,1],和u [2,1]分别为100,200和300。 我想做的形式

u[row_col_index] = u_pres 

的东西如果妳是一维数组这样的分配工作,但我无法弄清楚如何使这项工作对于二维数组。 你的建议将是最有帮助的。 谢谢

回答

0

你快到了。

你需要的是以下几点:

u[row_col_index[0], row_col_index[1]] = u_pres 

说明:

既然你说你是在Python初学者(!我太),我想我可能会告诉你这个;它被认为是unpythonic加载一个模块,你所做的一切:

#BAD 
from numpy import * 
#GOOD 
from numpy import array #or whatever it is you need 
#GOOD 
import numpy as np #if you need lots of things, this is better 

说明:

In [18]: u = np.zeros(10) 

In [19]: u 
Out[19]: array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) 

#1D assignment 
In [20]: u[0] = 1 

In [21]: u[1] = 10 

In [22]: u[-1] = 9 #last element 

In [23]: u[-2] = np.pi #second last element 

In [24]: u 
Out[24]: 
array([ 1.  , 10.  , 0.  , 0.  , 
     0.  , 0.  , 0.  , 0.  , 
     3.14159265, 9.  ]) 

In [25]: u.shape 
Out[25]: (10,) 

In [27]: u[9] #calling 
Out[27]: 9.0 

#2D case 
In [28]: y = np.zeros((4,2)) 

In [29]: y 
Out[29]: 
array([[ 0., 0.], 
     [ 0., 0.], 
     [ 0., 0.], 
     [ 0., 0.]]) 

In [30]: y[1] = 10 #this will assign all the second row to be 10 

In [31]: y 
Out[31]: 
array([[ 0., 0.], 
     [ 10., 10.], 
     [ 0., 0.], 
     [ 0., 0.]]) 

In [32]: y[0,1] = 9 #now this is 2D assignment, we use 2 indices! 

In [33]: y[3] = np.pi #all 4th row, similar to y[3,:], ':' means all 

In [34]: y[2,1] #3rd row, 2nd column 
Out[34]: 0.0 


In [36]: y[2,1] = 7 

In [37]: 

In [37]: y 
Out[37]: 
array([[ 0.  , 9.  ], 
     [ 10.  , 10.  ], 
     [ 0.  , 7.  ], 
     [ 3.14159265, 3.14159265]]) 

在你的情况,我们有row_col_indexrow_col_index[0])的第1个数组用于和第二个数组(row_col_index[1])用于列。

最后,如果您不使用ipython,我建议您这样做,它会帮助您进行学习过程和其他许多事情。

我希望这会有所帮助。

+0

感谢您提供最佳实践的详细解答和提示。我一直试图用row_col_index数组作为一个整体进行索引而不提取行。 – me10240

+0

不客气。你能否选择这个作为正确的答案。 – pythonista