关于python:字典中的NumPy切片表示法

NumPy slice notation in a dictionary

我想知道是否可以在Python字典中存储numpy slice符号。比如:

1
2
3
lookup = {0:[:540],
          30:[540:1080],
          60:[1080:]}

可以使用本机python slice语法,例如slice(0,10,2),但我无法存储更复杂的切片。例如,多维的东西。

我目前的工作是将值存储为元组,然后将其解包到必要的片中。

在python 2.x中工作。


语法[:, :2, :, :540]通过python转换为slice对象的元组:

1
2
3
4
(slice(None, None, None),
 slice(None, 2, None),
 slice(None, None, None),
 slice(None, 540, None))

生成这个元组的一个方便方法是使用特殊函数*np.s_。你只需要把它传递给[...]表达式。例如:

1
2
3
4
5
6
7
>>> np.s_[:540]
slice(None, 540, None)
>>> np.s_[:, :2, :, :540]
(slice(None, None, None),
 slice(None, 2, None),
 slice(None, None, None),
 slice(None, 540, None))

那么你的切片词典可以写成:

1
2
3
lookup = {0: np.s_[:540],
          30: np.s_[540:1080],
          60: np.s_[1080:]}

*从技术上讲,s_是实现特殊__getitem__方法的类IndexExpression的别名。


numpy有很多索引例程。在这种情况下,可以使用以下函数生成索引数组:

c_:将切片对象转换为沿第二个轴的连接。

r_:将切片对象转换为沿第一个轴的连接。

s_:为数组建立索引元组的更好方法。

您也可以使用numpy.unravel_index

Converts a tuple of index arrays into an array of flat indices, applying boundary modes to the multi-index.