2016-06-16 60 views
1

是否有一种优雅的方式来切片numpy数组,使得每提取一个第二个元素(由该行交替)? (假定的宽度和高度是2的倍数)Numpy slice 2D array with each two alternating elements

例如提取图案:

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

其中X装置提取该元件和-没有。

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

回答

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

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))