2016-05-13 49 views
1

鉴于以下阵列:更新选定的列在2D numpy的阵列与一维数组

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

索引与切片(':')基本上是在MATLAB和numpy的相同。但是,使用列表进行索引时有不同之处。 'b [[0,1,2,3],[1,2,3]]'是不同的(并且会产生一个错误)。 – hpaulj

回答

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

+0

'[:,无]'比MATLAB'repmat'简单。 – hpaulj

2

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

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

现在,让我们使用由NumPy的支持自动播放以取代repmat在MATLAB做了明确的复制,为此我们有必要通过沿着第一轴“推动”1D元件并引入单独尺寸作为第二轴来制作a二维阵列,其中np.newaxisa[:,np.newaxis]。请注意NumPy中维度的总称是轴。 np.newaxis的简写为None,因此我们需要使用a[:,None]并将其用于将元素分配到b

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

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