字典中的 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 切片符号的主要内容,如果未能解决你的问题,请参考以下文章