给出一个numpy矩阵:
input = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
我想在特定位置的每一行添加一个额外的元素。例如,在坐标(0,0)之后加100,在(1,1)之后加101和之后(0,2)加102,所以我的最终将如下所示:
output = np.array([
[1, 100, 2, 3],
[4, 5, 101, 6],
[7, 102, 8, 9]
])
你会怎么做?
答案 0 :(得分:3)
您可以使用新大小创建新数组,并根据预期索引替换项目:
In [15]: arr = np.zeros((3, 4))
In [16]: ind = [[0, 1, 2], [1, 2, 1]]
In [17]: arr[ind] = [100, 101, 102]
In [18]: arr[np.where(arr==0)] = input.ravel()
In [19]: arr
Out[19]:
array([[ 1., 100., 2., 3.],
[ 4., 5., 101., 6.],
[ 7., 102., 8., 9.]])
请注意,您可以使用np.where()
而不是使用np.place()
和直接索引(如果您需要功能方法)。
np.place(arr, arr==0, input.ravel())
答案 1 :(得分:0)
在numpy中你也可以指定“轴”;轴0在行中垂直向下运行,轴1在列之间水平运行。但是,如果您只想将元素添加到一行或一列,这将无济于事。在这两种情况下,您都可以使用np.insert()。
例如: np.insert(输出,1,2)给出输出 [(1,2,100,2,3,4,5,101,6,7,102,8,9)]
正如(像Joe所说),如果你只将一个元素添加到一行而不是其他行,那么数组的形状会被“破坏”。元素2在第一个索引处添加(编号从0开始)。另一种选择 np.insert(a,1,3,axis = 1)
然后在第一个索引的每一行插入一个3(默认情况下,每行的第一个元素再次为零索引)。有效地,仅包含3s的列被添加为第二列(=索引1)。
您还可以为所需的结果数组预分配一个空数组,即np.zeros(末尾为#desired size),并将此数组设置在要插入这些位置的元素所需的位置。 例如 emptyarray = np.zeros(4,4) emptyarray [1,4] = 10 如果你想在所需数组的第1行和第4列有一个10。
然后你可以使用for循环用你的'old'数组元素填充零元素...将它与if语句结合起来只改变零元素。这样做的好处是,您可以完全控制数组的结果维度,而不会收到错误消息。缺点是,如果只插入一个元素,则前一个元素的行索引和列索引可能会发生变化。所以你必须清楚你想要的结果数组所具有的维度。
答案 2 :(得分:0)
首先形成一个0x的3x4数组
a1 = np.zeros(3,4)
所以a1将是:array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
用所需的值替换给定的坐标,第一个数组表示轴,第二个表示该数组的相应元素。所以这些元素将替换为RHS中提供的元素:
a1[[0,1,2],[1,2,1]]=[100,101,102]
现在用iuput数组中的相应值替换其他位置的剩余0:
a1[np.where(a1==0)] = input.ravel()
输出:array([[ 1., 100., 2., 3.],
[ 4., 5., 101., 6.],
[ 7., 102., 8., 9.]])