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

时间:2016-08-12 11:44:52

标签: 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]

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

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

这是numpy支持的东西吗?

2 个答案:

答案 0 :(得分:12)

是的,您可以使用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_将切片对象转换为沿第一轴的连接。

答案 1 :(得分:0)

您可以使用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))