Numpy切片2D数组,每两个交替元素

时间:2016-06-16 08:16:30

标签: python numpy

是否有一种优雅的方法来切片numpy数组,以便提取每一个元素(由行交替)? (假设宽度和高度是2的倍数)

示例提取模式:

[[ X, - , X , -],
 [ -, X , - , X],
 [ X, - , X , -],
 [ -, X , - , X],
 ...]]

其中X表示提取此元素而-表示不提取。

结果将是原始数组宽度的一半或高度的一半。

2 个答案:

答案 0 :(得分:1)

没有办法用步幅来做到这一点,因为你无法用简单的函数来处理这些元素。

使用例如的花式索引一个面具将是要走的路。这看起来相当优雅:

>>> arr = np.random.random_integers(0,9, (4,4))
>>> mask = np.fromfunction(lambda i, j: (i+j)%2 ==0 , arr.shape, dtype=int)
>>> np.ma.masked_array(arr, mask=~mask)
masked_array(data =
 [[0 -- 1 --]
 [-- 7 -- 6]
 [9 -- 9 --]
 [-- 1 -- 3]],
             mask =
 [[False  True False  True]
 [ True False  True False]
 [False  True False  True]
 [ True False  True False]],
       fill_value = 999999)

最后一行仅用于演示目的。如果要提取数据,请使用索引:arr[mask],如果您需要以2维方式需要,可以选择后跟reshape(arr.shape[0]//2, -1)。当数组的宽度和高度不是2的倍数时,此方法也有效。

答案 1 :(得分:0)

尝试了一段时间后,我还找到了一个将原始数组宽度减半的答案

x = np.random.random((6,4))

res = np.vstack(zip(x[0::2, 0::2], x[1::2, 1::2])).reshape((x.shape[0], x.shape[1]//2))