簡體   English   中英

對稱地添加數組的左右部分 - python

[英]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+911+193+713+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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM