【问题标题】:Passing list as slice for a N-dimensional numpy array将列表作为切片传递给 N 维 numpy 数组
【发布时间】:2014-03-18 09:28:09
【问题描述】:

我正在尝试根据用户的决定来操作 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

【问题讨论】:

    标签: python numpy slice multidimensional-array


    【解决方案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]]])
    

    【讨论】:

    • 感谢您的快速回复!这在交互模式下工作得很好,但不知何故在我的脚本中我得到了一个新错误:toChange = [0, 0, slice(None, None, None)] TypeError: 'numpy.ndarray' object is not callable 是否有可能toChange 被认为是一个数组?
    • 最好使用元组进行 ND 索引。列表/序列的使用取决于不稳定的逻辑,我个人更愿意禁止它。
    • 好的,我遇到了问题:切片不起作用,因为在操作数组之前,我使用with open("out/histData.txt", "w") as dataFile: for slice in histData: np.savetxt(dataFile, slice, fmt="%.2f", delimiter="\t") 将整个数组写入文件因此slice 是一个ndarray 和整个事情没有奏效。业余时间 :-) @seberg:这个解决方案会是什么样子?
    • @Gnihilo,一模一样,只是确保 toChange 是最后的一个元组(如果你需要列表的可变性,只需调用tuple(toChange)
    猜你喜欢
    • 2018-04-22
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多