Snake遍历2D NumPy数组

问题描述 投票:5回答:1

我有以下2D数组:

In [173]: arr
Out[173]: 
array([[ 1,  2,  3,  4],   # -> -> -> ->
       [ 5,  6,  7,  8],   # <- <- <- <-
       [ 9, 10, 11, 12],   # -> -> -> ->
       [13, 14, 15, 16],   # <- <- <- <-
       [17, 18, 19, 20]])  # -> -> -> ->

而且我想在snake-like pattern中从左上角元素开始遍历数组,最后是右下角元素。

截至目前,我有这种无趣的解决方法:

In [187]: np.hstack((arr[0], arr[1][::-1], arr[2], arr[3][::-1], arr[4]))
Out[187]: 
array([ 1,  2,  3,  4,  8,  7,  6,  5,  9, 10, 11, 12, 16, 15, 14, 13, 17,
       18, 19, 20])

如何在没有循环且没有太多硬编码的情况下以最小的努力完成它?

python numpy multidimensional-array traversal numpy-ndarray
1个回答
4
投票

一种方法是从输入的副本开始,然后用输入的相应行的列翻转版本替换第二行,并使用步长切片对所有偶数行执行此操作。最后,最终需要一个ravel()用于所需的扁平版本。

因此,实现看起来像这样 -

out = arr.copy()
out[1::2] = arr[1::2,::-1]
out = out.ravel()

另一个紧凑的方法是使用qazxsw poi在col-flipped和non-flipped版本之间进行选择,从而实现我们想要的输出 -

np.where

对给定样本的解释 -

np.where(np.arange(len(arr))[:,None]%2,arr[:,::-1],arr).ravel()
© www.soinside.com 2019 - 2024. All rights reserved.