使用1D阵列更新2D numpy数组中的选定列

时间:2016-05-13 17:49:31

标签: python arrays matlab numpy

给出以下数组:

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

如何使用最少量的代码获取以下数组?基本上使用数组b更新数组a的部分:

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]) 

2 个答案:

答案 0 :(得分:2)

你可以写:

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),以便轴正确排列以允许广播。

答案 1 :(得分:2)

初始化输出数组并设置a,就像我们为MATLAB做的那样 -

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

现在,让我们使用NumPy支持的自动广播来替换MATLAB中repmat所做的显式复制,我们需要通过“推”1D元素来使a成为一个二维数组。第一个轴并引入单个维度作为第二个轴,np.newaxisa[:,np.newaxis]。请注意NumPy中维度的一般术语是轴。 np.newaxis的简写为None,因此我们需要使用a[:,None]并将其用于将元素分配到b

因此,最后一步是考虑我们在Python中有0-based索引,我们会有 -

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