如何为Numpy数组创建切片对象?

Fri*_*rub 12 python arrays numpy

我试图找到一个简洁的解决方案,但我正在以相同的方式切割几个相同形状的2D阵列.我通过定义一个包含'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]
Run Code Online (Sandbox Code Playgroud)

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

a1 = array1[predefined_2dslice] 
a2 = array2[predefined_2dslice] 
a3 = array3[predefined_2dslice] 
Run Code Online (Sandbox Code Playgroud)

这是numpy支持的东西吗?

Kas*_*mvd 20

是的你可以使用numpy.s_:

例:

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

在这种情况下:

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]
Run Code Online (Sandbox Code Playgroud)

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

  • 这正是我想要的。我喜欢学习整洁的新技巧时喜欢:)谢谢 (3认同)
  • 并查看`np.s_`产生的值。这只是一个元组。 (3认同)
  • 为什么要给这些有用的实用函数起如此神秘的名称,尤其是暗示内部某些内容的下划线?历史? (3认同)
  • @FriskyGrub如果您想了解更多有关此类技巧的信息,建议您深入阅读文档;-) (2认同)

ben*_*min 9

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

window = slice(col_start, col_stop), slice(row_start, row_stop)
a1 = array1[window]
a2 = array2[window] 
Run Code Online (Sandbox Code Playgroud)

这不是特定于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))
Run Code Online (Sandbox Code Playgroud)