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

问题描述 投票:1回答:2

我已经将黑白图像加载为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]

但这不起作用,因为我无法连接这些值。有没有办法实现这个目标?

python list int concatenation slice
2个回答
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
投票

您应该使用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]])
© www.soinside.com 2019 - 2024. All rights reserved.