[英]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.newaxis
為a[:,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.