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

时间:2017-12-31 16:45:23

标签: python list int concatenation slice

我已将黑白图像加载为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 个答案:

答案 0 :(得分:5)

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

  

切片的语义如下。使用从切片列表构造的密钥对主数据库进行索引(使用与正常预订相同的__getitem__()方法),如下所示。 如果切片列表包含至少一个逗号,则该键是包含切片项转换的元组;否则,单个切片项的转换是关键。作为表达式的切片项的转换是该表达式。 正确切片的转换是slice对象(请参阅The standard type hierarchy部分),其startstopstep属性是分别以下限,上限和步幅给出的表达式,用None代替缺失的表达式。

大胆强调我的。

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

所以

numpy_array_to_slice[160:300,28:43]

相当于

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

我省略了step参数;省略时默认为None

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

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]

答案 1 :(得分:1)

您应该使用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]])