在numpy.insert命令中插入值的顺序是什么?

时间:2018-05-19 09:15:24

标签: python python-2.7 numpy

我试图了解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)`

2 个答案:

答案 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