如何获得所有阵列边缘?
问题内容:
我有一个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])