我试图了解numpy.insert
命令在2D数组中的工作原理。我知道这个命令中的第三个值是我们要插入的值,但[2,2]
表示什么?当我打印第二个示例的结果时,[0,1]
沿着第二列之前的列轴出现,但在第一个示例中[0,1]
沿着行轴出现。我无法理解这种行为。有人可以指导我吗?
`#first example
s=numpy.array([[1,2,3],[2,3,4]])
print s
t= numpy.insert(s, [2,2], [0,1],axis=1)
print t
#second example
a=numpy.array([[1,2,3],[2,3,4]])
b=numpy.insert(a, 2,[0,1],axis=1)`
答案 0 :(得分:1)
In [606]: s=numpy.array([[1,2,3],[2,3,4]])
In [607]: np.insert(s,[2,2],[10,11], axis=1)
Out[607]:
array([[ 1, 2, 10, 11, 3],
[ 2, 3, 10, 11, 4]])
所以这是将10
放在第2列,将11
放在第2列。它是一次完成的,而不是迭代的。
In [608]: np.insert(s,[0,1],[10,11], axis=1)
Out[608]:
array([[10, 1, 11, 2, 3],
[10, 2, 11, 3, 4]])
这里可能更明显,10
位于第0列,11
位于原始1th
。
注意它是按列插入的,所以2d的轴= 1的行为与没有轴的1d相同。
等效列表插入是:
In [626]: alist = [1,2,3]
In [627]: for i,v in zip([1,0],[11,10]): alist[i:i] = [v]
In [628]: alist
Out[628]: [10, 1, 11, 2, 3]
请注意,我从头开始。否则插入
使用标量将两个值插入一列:
In [610]: np.insert(s,2,[10,11], axis=1)
Out[610]:
array([[ 1, 2, 10, 3],
[ 2, 3, 11, 4]])
使用单个元素列表,[2]
效果与[2,2]
相同:
In [614]: np.insert(s,[2],[10,11], axis=1)
Out[614]:
array([[ 1, 2, 10, 11, 3],
[ 2, 3, 10, 11, 4]])
文档说明了使用标量和列表进行索引之间的区别。
似乎还有一种广播正在进行中。单个[2]
可以使用双[10,11]
进行广播。相反,文档有一个例子
np.insert(x, (1,3), 999, axis=1)
指数和价值观之间广播的其他例子:
In [636]: np.insert(s,[0,1,2,3],[[10],[11]], axis=1)
Out[636]:
array([[10, 1, 10, 2, 10, 3, 10],
[11, 2, 11, 3, 11, 4, 11]])
In [639]: np.insert(s,[0,1,2,3],[10,11,12,13], axis=1)
....
In [640]: np.insert(s,[0,1,2,3],np.arange(8).reshape(2,-1), axis=1)
...
事实上,如果你不匹配形状,你可能会收到广播错误:
In [638]: np.insert(s,[0,1,2,3],[10,11,12], axis=1)
...
5104 slobj[axis] = indices
5105 slobj2[axis] = old_mask
-> 5106 new[slobj] = values
5107 new[slobj2] = arr
5108
ValueError: shape mismatch: value array of shape (3,) could not be broadcast to indexing result of shape (4,2)
它构造了一个slobj
索引元组,并尝试将values
放在那里。 slobj2
是原始值所属的索引元组。
从某种意义上说,np.insert
很难理解,因为它试图变得如此强大,处理索引和值的许多不同组合。它是纯Python,所以它可以做任何事情,你也可以做。只需创建一个正确大小的目标数组,并将值复制到正确的插槽中。
答案 1 :(得分:0)
<强>语法强>:
numpy.insert(arr, obj, values, axis=None)
示例1 :
t = numpy.insert(s, [2, 3], [0, 1], axis=1)
s
是输入numpy数组。
[2, 3]
指定您需要插入值的位置。首先2
表示
您的第一个值将在第二个索引之前插入。下一个3
表示在第三个索引之前插入第二个值。 (在这里,我在您的示例中使用了第二个值3
而不是2
,只是为了让您更好地理解。)
[0, 1]
是您要插入的值。在这里,0
将在第二个索引之前插入,1
将在第三个索引之前插入。
axis=1
表示插入列。
示例2 :
b = numpy.insert(a, 2, [0, 1], axis=1)
a
是输入numpy数组。
2
表示在第二个位置前插入。
[0, 1]
表示在第一行插入0
,在第二行插入1
。
axis=1
表示插入列。
注意:如果axis=0
,则值将作为新行插入。如果未给出轴或设置为None
,则在插入之前将数组展平。
有关详细信息,您可以随时参考文档here。