将列表作为切片传递给N维numpy数组

时间:2014-02-18 14:36:07

标签: 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 raw_input

a[toChange] = 0

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

或者是否有更智能的方法来操纵用户定义的切片?

PS:因为我正在使用oldstable Debian,所以我使用的是Python 2.6.6和Numpy 1.4.1

1 个答案:

答案 0 :(得分: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]]])