繁体   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