Python 将列表作为N维numpy数组的切片传递
我试图根据用户的决定操纵N维数组的值,在哪个索引处数组应该被更改。这个例子很好:Python 将列表作为N维numpy数组的切片传递,python,numpy,slice,multidimensional-array,Python,Numpy,Slice,Multidimensional Array,我试图根据用户的决定操纵N维数组的值,在哪个索引处数组应该被更改。这个例子很好: 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
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:使用序列设置数组元素。
我可以看出问题出在“:”字符串上,因为a[0,0,:]=0
正是我想要的。问题是,如何将字符串传递给数组
或者有没有更聪明的方法来操作用户定义的切片
PS:当我在使用一个oldstable Debian时,我使用Python 2.6.6和Numpy 1.4.1:
是切片
对象的语法糖:
>>> class Indexable(object):
... def __getitem__(self, idx):
... return idx
...
>>> Indexable()[0, 0, :]
(0, 0, slice(None, None, None))
因此,如果用切片(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]]])
感谢您的快速回复!这在交互模式下工作得很好,但在我的脚本中,不知何故我遇到了一个新错误:toChange=[0,0,slice(None,None,None)]TypeError:“numpy.ndarray”对象不可调用
是否有可能将toChange
视为数组?最好使用元组进行索引。列表/序列的使用依赖于不稳定的逻辑,我个人更倾向于禁止它。好吧,我遇到了问题:切片不起作用,因为在操作数组之前,我将整个数组写入一个文件,使用open(“out/histData.txt”,“w”)作为数据文件:对于histData中的切片:np.savetxt(dataFile,slice,fmt=“%.2f”,delimiter=“\t”)
因此slice
是一个数组,整个过程都不起作用。业余时间:-)@seberg:这个解决方案是什么样子的?@Gnihilo,完全一样,只要确保最后的toChange是一个元组(如果列表需要可变性,只需调用tuple(toChange)
)