将列表插入基于numpy的矩阵

时间:2018-02-21 18:30:09

标签: python python-2.7 numpy

我想在特定索引中将基于numpy的矩阵插入列表。例如,以下代码(python 2.7)应该将列表[5,6,7]插入到M中的第二位:

M = [[0, 0], [0, 1], [1, 0], [1, 1]]
M = np.asarray(M)
X = np.insert(M, 1, [5,6,7])
print(X)

然而,这并没有输出我想要的东西。它通过将所有列表合并到一个列表中而导致矩阵M变得混乱。如何在基于numpy的矩阵的任何位置添加任何列表?

谢谢

1 个答案:

答案 0 :(得分:0)

In [80]: M = [[0, 0], [0, 1], [1, 0], [1, 1]]
    ...: M1 = np.asarray(M)
    ...: 

列表插入:

In [81]: M[1:2] = [[5,6,7]]
In [82]: M
Out[82]: [[0, 0], [5, 6, 7], [1, 0], [1, 1]]

对比由原始M和修改后的M制作的数组:

In [83]: M1
Out[83]: 
array([[0, 0],
       [0, 1],
       [1, 0],
       [1, 1]])
In [84]: np.array(M)
Out[84]: 
array([list([0, 0]), list([5, 6, 7]), list([1, 0]), list([1, 1])],
      dtype=object)

第二个不是二维数组。

没有轴的

np.insert会使事情发生变化(查看文档)

In [85]: np.insert(M1,1,[5,6,7])
Out[85]: array([0, 5, 6, 7, 0, 0, 1, 1, 0, 1, 1])

如果我指定一个轴,它会抱怨形状不匹配:

In [86]: np.insert(M1,1,[5,6,7],axis=0)
   ...
   5071         new[slobj] = arr[slobj]
   5072         slobj[axis] = slice(index, index+numnew)
-> 5073         new[slobj] = values
   5074         slobj[axis] = slice(index+numnew, None)
   5075         slobj2 = [slice(None)] * ndim

ValueError: could not broadcast input array from shape (1,3) into shape (1,2)

它会创建一个(1,2)形状的插槽来接收新值,但[5,6,7]不适合。

In [87]: np.insert(M1,1,[5,6],axis=0)
Out[87]: 
array([[0, 0],
       [5, 6],
       [0, 1],
       [1, 0],
       [1, 1]])