是否有一種優雅的方式來切片numpy
數組,使得每提取一個第二個元素(由該行交替)? (假定的寬度和高度是2的倍數)Numpy slice 2D array with each two alternating elements
例如提取圖案:
[[ X, - , X , -],
[ -, X , - , X],
[ X, - , X , -],
[ -, X , - , X],
...]]
其中X
裝置提取該元件和-
沒有。
結果將是原始數組寬度的一半或高度的一半。
是否有一種優雅的方式來切片numpy
數組,使得每提取一個第二個元素(由該行交替)? (假定的寬度和高度是2的倍數)Numpy slice 2D array with each two alternating elements
例如提取圖案:
[[ X, - , X , -],
[ -, X , - , X],
[ X, - , X , -],
[ -, X , - , X],
...]]
其中X
裝置提取該元件和-
沒有。
結果將是原始數組寬度的一半或高度的一半。
沒有辦法用大步做到這一點,因爲你無法用簡單的函數來處理這些元素。
花式索引使用例如一個面具將是要走的路。這似乎相當優雅:
>>> 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
倍數在努力了一段時間,我也找到了答案,這將減半原來陣列的寬度
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))