代码之家  ›  专栏  ›  技术社区  ›  Josh Flori

索引值为字符串的切片列表?

  •  1
  • Josh Flori  · 技术社区  · 7 年前

    我已经加载了一个黑白图像作为numpy数组。阵列形状等于图像中的像素。我想提取特定范围的像素值,例如,

    numpy_array_to_slice[160:300,28:43] 
    

    等等,但我不想硬编码索引号。相反,我想从值列表中加载索引值。例如,我有一个索引值列表,如:

    listofindexvalues = [['160:300,28:43'],['160:300,40:55'],['160:300,28:43']] 
    

    所以实际上我想要这样的东西:

    numpy_array_to_slice[listofindexvalues[0]]
    

    将取代:

    numpy_array_to_slice['160:300,28:43']
    

    我尝试过很多不起作用的事情,比如:

    first,second = str(index_list[19]).replace('[','').replace(']','').replace('\'','').split(':')  ##for just one side of an index value, such as 28:59
    

    试着这样通过:

    numpy_array_to_slice[int(first)+':'+int(second]
    

    但这不起作用,因为我无法连接这些值。有没有办法做到这一点?

    2 回复  |  直到 7 年前
        1
  •  5
  •   Martijn Pieters    7 年前

    切片是 语法 ,而不是字符串。请参见 Slicings expressions reference documentation :

    切片的语义如下所示。主要索引(使用相同的 __getitem__() 方法作为普通订阅),使用从切片列表构造的键,如下所示。 如果切片列表至少包含一个逗号,则键是包含切片项转换的元组 ; 否则,单独切片项的转换是关键。作为表达式的切片项的转换就是该表达式。 正确切片的转换是 slice 对象(请参见第节 The standard type hierarchy )谁的 start , stop step 属性是分别作为下限、上限和步幅给出的表达式的值,替换为 None 查找缺少的表达式。

    粗体强调我的。

    您可以绕过此转换(从切片语法到 slice() 对象)通过创建 切片() 直接针对对象;如果需要,可以将它们放入元组中。

    所以

    numpy_array_to_slice[160:300,28:43]
    

    相当于

    box = slice(160, 300), slice(28, 43)
    numpy_array_to_slice[box]
    

    我省略了 论点默认为 没有一个 省略时。

    将此扩展到您的列表将是:

    listofindexvalues = [
        (slice(160, 300), slice(28, 43)),
        (slice(160, 300), slice(40, 55)),
        (slice(160, 300), slice(28, 43))
    ]
    
    for box in listofindexvalues:
        sliced_array = numpy_array_to_slice[box]
    
        2
  •  1
  •   timgeb    7 年前

    您应该使用 slice 实例(或其元组),而不是字符串。

    这里有一个例子。

    >>> import numpy as np
    >>> 
    >>> listofindexvalues = [(slice(1, 6), slice(3, 4))]
    >>> a = np.arange(100).reshape(10,10)
    >>> a[listofindexvalues[0]]
    array([[13],
           [23],
           [33],
           [43],
           [53]])
    

    a[listofindexvalues[0]] 相当于 a[1:6, 3:4] 在这种情况下。

    >>> a[1:6, 3:4]
    array([[13],
           [23],
           [33],
           [43],
           [53]])