2014-02-18 48 views
1

我试图操纵根据用户的决定一个N维数组,在该指数的阵列应该改变的值。这个例子正常工作:传递列表作为切片中的N维数组numpy的

import numpy as np 
a = np.arange(24).reshape(2,3,4) 

toChange = ['0', '0', '0'] #input from user via raw_input 

a[toChange] = 0 

但是,如果我想改变的不仅仅是一个位置,而是一个完整的行,我碰到的问题:

toChange = ['0', '0', ':'] #input from user via raw_input 

a[toChange] = 0 

这将导致ValueError: setting an array element with a sequence。 我可以看到问题是':'字符串,因为a[0, 0, :] = 0完全符合我的要求。问题是,如何将字符串传递给数组?

还是有操纵用户定义的切片一个更聪明的方式?

PS:因为我工作的一个oldstable的Debian的我使用Python 2.6.6和1.4.1 numpy的

回答

1

:是一个slice对象语法糖:

>>> class Indexable(object): 
...  def __getitem__(self, idx): 
...   return idx 
...  
>>> Indexable()[0, 0, :] 
(0, 0, slice(None, None, None)) 

因此,如果您更换':'使用slice(None, None, None)您会得到期望的结果:

>>> toChange = [0, 0, slice(None, None, None)] 
>>> a[toChange] = 0 
>>> a 
array([[[ 0, 0, 0, 0], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]], 

     [[12, 13, 14, 15], 
     [16, 17, 18, 19], 
     [20, 21, 22, 23]]]) 
+0

感谢您的快速响应!这很好地工作在交互模式,但不知何故,在我的剧本我得到一个新的错误:'toChange = [0,0,片(无,无,无)] 类型错误:“numpy.ndarray”对象不callable'是有可能'toChange'被认为是一个数组? – Gnihilo

+0

使用元组来执行ND索引是可取的。列表/序列的使用取决于不稳定的逻辑,我个人更喜欢只是禁止它。 – seberg

+0

好吧,我得到了这个问题:切片没有工作,因为操纵阵列之前,我整个数组写入使用 '用打开文件(“出/ histData.txt”,“W”)为数据文件: 在histData片: np.savetxt(数据文件,切片,FMT = “%2F”,分隔符= “\ t” 的)' 因此'slice'是一个ndarray整个事情没有工作。业余时间:-) @seberg:这个解决方案看起来如何? – Gnihilo