字典中的 NumPy 切片表示法

NumPy slice notation in a dictionary

我想知道是否可以在 python 字典中存储 numpy 切片符号。类似于:

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

可以使用原生 python 切片语法,例如slice(0,10,2),但我一直无法存储更复杂的切片。例如,多维的东西 [:,:2,:, :540].

我目前的解决方法是将值存储为元组,然后将它们解压缩到必要的切片中。

在 Python 2.x 工作。

语法 [:, :2, :, :540] 被 Python 转换为 slice 个对象的元组:

(slice(None, None, None),
 slice(None, 2, None),
 slice(None, None, None),
 slice(None, 540, None))

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

>>> 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))

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

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

* 技术上 s_ 是实现特殊 __getitem__ 方法的 class IndexExpression 的别名。

Numpy 有很多 Indexing routines 。在这种情况下,您可以使用以下函数生成索引数组:

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.