【问题标题】:How can I create a slice object for Numpy array?如何为 Numpy 数组创建切片对象?
【发布时间】:2016-08-12 11:44:52
【问题描述】:

我试图找到一个巧妙的解决方案,但我正在以相同的方式切割几个相同形状的二维数组。我通过定义一个包含“x,y”中心的列表来尽可能地整理它,例如cpix = [161, 134] 我想做的是不必像这样写三遍切片:

a1 = array1[cpix[1]-50:cpix[1]+50, cpix[0]-50:cpix[0]+50] 
a2 = array2[cpix[1]-50:cpix[1]+50, cpix[0]-50:cpix[0]+50] 
a3 = array3[cpix[1]-50:cpix[1]+50, cpix[0]-50:cpix[0]+50]

只是有一些预定义的东西(比如可能是一个面具?)所以我可以做一个

a1 = array1[predefined_2dslice] 
a2 = array2[predefined_2dslice] 
a3 = array3[predefined_2dslice] 

这是 numpy 支持的东西吗?

【问题讨论】:

  • np.s_ 生成切片对象的元组:(slice(cpix[1]-50:cpix[1]+50), slice(cpix[0]-50:cpix[0]+50))

标签: python arrays numpy


【解决方案1】:

是的,您可以使用numpy.s_

例子:

>>> a = np.arange(10).reshape(2, 5)
>>> 
>>> m = np.s_[0:2, 3:4]
>>> 
>>> a[m]
array([[3],
       [8]])

在这种情况下:

my_slice = np.s_[cpix[1]-50:cpix[1]+50, cpix[0]-50:cpix[0]+50]

a1 = array1[my_slice] 
a2 = array2[my_slice] 
a3 = array3[my_slice]

您还可以使用numpy.r_ 将切片对象转换为沿第一个轴的连接。

【讨论】:

  • 这正是我想要的。我喜欢学习这样的新技巧:)谢谢
  • @FriskyGrub 如果你想了解更多关于这些技巧的信息,我建议你深入研究文档;-)
  • 再看看np.s_产生的值。它只是一个元组。
  • 为什么要给这些有用的实用函数起这样神秘的名字,尤其是暗示内部事物的下划线?历史?
【解决方案2】:

您可以使用 slice 对象的元组来索引多维数组。

window = slice(col_start, col_stop), slice(row_start, row_stop)
a1 = array1[window]
a2 = array2[window] 

这并不特定于 numpy,它只是订阅/切片语法在 python 中的工作原理。

class mock_array:
    def __getitem__(self, key):
        print(key)
m = mock_array()
m[1:3, 7:9] # prints tuple(slice(1, 3, None), slice(7, 9, None))

【讨论】:

  • 这个答案比 IMO 公认的更优雅。
  • numpy.s_ 无论如何都会返回切片对象。对于一维切片,后一个命令可能更具可读性,但对于更高维度,我肯定更喜欢前者。
  • mock_array的定义真的很接近np.s_或者np.index_exp后面的东西,见source code of np.IndexExpression
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多