给出以下数组:
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])
答案 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.newaxis
为a[:,np.newaxis]
。请注意NumPy中维度的一般术语是轴。 np.newaxis
的简写为None
,因此我们需要使用a[:,None]
并将其用于将元素分配到b
。
因此,最后一步是考虑我们在Python中有0-based
索引,我们会有 -
b[0:4,1:4] = a[:,None]