【问题标题】:NumPy slice notation in a dictionary字典中的 NumPy 切片符号
【发布时间】: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 并传递数组

标签: python python-2.7 numpy dictionary slice


【解决方案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

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

【讨论】:

    猜你喜欢
    • 2017-06-03
    • 2021-04-21
    • 1970-01-01
    • 2017-04-19
    • 2015-05-26
    • 2018-10-09
    • 2018-12-31
    • 2019-12-04
    相关资源
    最近更新 更多