[英]add left and right portions of the array symmetrically - python
a = np.array([[[ 1, 11],
[ 3, 13],
[ 5, 15],
[ 7, 17],
[ 9, 19]],
[[ 2, 12],
[ 4, 14],
[ 6, 16],
[ 8, 18],
[10, 20]]])
我試圖沿第二維以對稱的方式將左側部分添加到數組的右側部分(因此上面的第一個子數組為1+9
、 11+19
、 3+7
、 13+17
)。
我試過這個
>>> middle = int(np.ceil(a.shape[1]/2))
>>> a[:,:middle-1,:] + a[:,middle:,:]
array([[[ 8, 28],
[12, 32]],
[[10, 30],
[14, 34]]], dtype=uint8)
它將左側添加到右側但不對稱。 這是我希望得到的
array([[[10, 30],
[10, 30]],
[[12, 32],
[12, 32]]], dtype=uint8)
看起來您可以反轉數組,添加並剪切到a.shape[1]//2
中間
(a + a[:,::-1,:])[:, :a.shape[1]//2, :]
array([[[10, 30],
[10, 30]],
[[12, 32],
[12, 32]]])
對您的代碼稍作修改即可:
middle = int(np.ceil(a.shape[1]/2))
print(a[:,:middle-1,:] + a[:,:middle-1:-1,:])
第二個加數在這里以不同的方式切片以反轉它。 (原來是a[:,middle:,:]
)
結果:
[[[10 30]
[10 30]]
[[12 32]
[12 32]]]
您可以使用反向切片“ [b:a:-1]
”
i,j,k = a.shape
a[:,:j//2] + a[:,:(j-1)//2:-1]
# array([[[10, 30],
# [10, 30]],
#
# [[12, 32],
# [12, 32]]])
或者為了避免向后限制的稍微容易出錯的計算,您可以使用np.fliplr
half = np.s_[:,:a.shape[1]//2]
a[half] + np.fliplr(a)[half]
# array([[[10, 30],
# [10, 30]],
#
# [[12, 32],
# [12, 32]]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.