如何获得所有阵列边缘?


问题内容

我有一个anxn数组,想接收它的轮廓值。例如,

[4,5,6,7]

[ 2,2,6,3 ]

[ 4,4,9,4 ]

[8,1,6,1]

从这个,我会得到这个

[4,5,6,7,3,4,1,6,1,8,4,2]

(请参阅粗体字)

因此,从本质上讲,获取围绕2D数组边缘的所有值的1D数组的最 有效
方法是什么?我问是因为我假设有一个numPy函数可以帮助解决此问题(尚未找到!),而不是通过循环手动进行?


问题答案:
In [1]: arr=np.arange(16).reshape(4,4)
In [2]: arr
Out[2]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

一种相对简单的方法-按顺时针顺序为:

In [5]: alist=[arr[0,:-1], arr[:-1,-1], arr[-1,::-1], arr[-2:0:-1,0]]
In [6]: alist
Out[6]: [array([0, 1, 2]), array([ 3,  7, 11]), array([15, 14, 13, 12]), array([8, 4])]
In [7]: np.concatenate(alist)
Out[7]: array([ 0,  1,  2,  3,  7, 11, 15, 14, 13, 12,  8,  4])

从某种意义上说,这是一个循环,因为我必须构建4个切片。但是,如果4与相比很小n,那是一个很小的价格。它必须在一定程度上串联。

如果顺序无关紧要,我们可以简化切片(例如,忘记反向顺序,等等)。

alist=[arr[0,:], arr[1:,-1], arr[-1,:-1], arr[1:-1,0]]

如果我不在乎顺序,或重复计算角落,可以使用:

np.array([arr[[0,n],:], arr[:,[0,n]].T]).ravel()

消除重复的角落

In [18]: np.concatenate((arr[[0,n],:].ravel(), arr[1:-1,[0,n]].ravel()))
Out[18]: array([ 0,  1,  2,  3, 12, 13, 14, 15,  4,  7,  8, 11])