簡體   English   中英

使用1D數組更新2D numpy數組中的選定列

[英]Update selected columns in 2D numpy array with 1D array

給定以下數組:

from numpy import * 
b = ones((5,5))
a = arange(4)

如何以最少的代碼獲取以下數組? 基本上用數組a更新數組b部分:

array([[ 1.,  0.,  0.,  0.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  2.,  2.,  2.,  1.],
       [ 1.,  3.,  3.,  3.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])

在matlab中,我可以使用一行代碼來實現這一點:

b = ones(5,5);
a = [0,1,2,3];
b(1:4,2:4) = repmat(a',[1,3]) 

你可以寫:

b[0:4, 1:4] = a[:, None]

使b等於:

array([[ 1.,  0.,  0.,  0.,  1.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 1.,  2.,  2.,  2.,  1.],
       [ 1.,  3.,  3.,  3.,  1.],
       [ 1.,  1.,  1.,  1.,  1.]])

b[0:4, 1:4]選擇適當的b切片(回想起Python使用從零開始的索引)。

為了完成向量a的分配,必須使用a[:, None]添加一個長度為1的額外軸。 這是因為b的切片的形狀為(4,3),我們需要a形狀為(4,1),以便軸正確對齊以允許廣播。

初始化輸出數組並設置a ,就像我們對MATLAB所做的那樣-

b = np.ones((5,5))
a = np.array([0,1,2,3])

現在,讓我們使用由NumPy的支持自動播放,以取代被做了明確的復制repmat在MATLAB,為此,我們需要a由“推”沿第一軸的一維元素,並引入一個單維度的第二二維數組np.newaxisa[:,np.newaxis]軸。 請注意,NumPy中尺寸的通用術語是軸。 np.newaxis的簡寫是None ,因此我們需要使用a[:,None]並將其分配給b

因此,最后一步將是考慮在Python中0-based索引,我們將-

b[0:4,1:4] = a[:,None]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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