字典中的 NumPy 切片符号

Posted

技术标签:

【中文标题】字典中的 NumPy 切片符号【英文标题】:NumPy slice notation in a dictionary 【发布时间】:2015-07-26 12:08:56 【问题描述】:

我想知道是否可以在 python 字典中存储 numpy 切片表示法。比如:

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

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

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

在 Python 2.x 中工作。

【问题讨论】:

我建议重新构建问题以纯粹关注如何存储切片表达式。 +1 任一方式 您可以使用 slice 的元组使其适用于多个维度 你可以使用 lambdas 并传递数组 【参考方案1】:

语法[:, :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_ 是类 IndexExpression 的别名,它实现了一个特殊的 __getitem__ 方法。

【讨论】:

我不知道np.s_,这真是太棒了,因为它为那些不喜欢纯python切片符号的人提供了更多的可读性。 我正要建议用简单的def __getitem__(self, item): return item 编写一个自定义类,但我想这基本上就是s_ 所做的。不知道那个!【参考方案2】:

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

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

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

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

你也可以使用numpy.unravel_index

将索引数组元组转换为平面索引数组,将边界模式应用于多索引。

【讨论】:

以上是关于字典中的 NumPy 切片符号的主要内容,如果未能解决你的问题,请参考以下文章

乐哥学AI_Python:Numpy索引,切片,常用函数

NumPy 数组切片索引

NumPy索引切片

numpy数组的索引和切片

切片numpy加载文件如何加载到内存中

当步长大于1时,通过数组切片和numpy.diff替换python中的for循环