numpy:将行附加到单个3D数组

时间:2015-01-30 22:58:31

标签: python arrays numpy

有很多帖子和博客都在谈论如何使用append,vstack或concatenate来操作2D数组,但是我无法使它在3D中工作。

问题假设:

- 3D阵列的形状为(k,m,2)。

- k将是已知值

- m的范围可以从1到n,并且不是预定的

In [1]: import numpy as np

In [2]: a = np.empty((3, 1, 2))
Out[2]:
array([[[0., 0.]],
       [[0., 0.]],
       [[0., 0.]]])

In [3]: a[0] = [[5, 6]]

In [4]: a
Out[4]:
array([[[5., 6.]],
       [[0., 0.]],
       [[0., 0.]]])

In [5]: a[0] = np.vstack((a[0], [[10, 15]]))
Out[5]:
ValueError: could not broadcast input array from shape (2,2) into shape(1,2)

In [6]: a[0] = np.append(a[0], [[10, 15]], axis=0)
Out[6]:
ValueError: could not broadcast input array from shape (2,2) into shape(1,2)

所需的输出是。

array([[[5., 6.  ]
        [10., 15.]],
        [[0., 0.]],
        [[0., 0.]]])

任何帮助都将不胜感激。

澄清:

我正在寻找的输出就是这样。

[[[ 5,  6],
  [10, 15]],

 [[ 0,  0]],

 [[ 0,  0]]]

Kyle Booth的回应与之相近:

c = np.insert(a, 1, b, axis=1)

[[[ 5,  6],
  [10, 15]],

 [[ 0,  0],
  [10, 15]],

 [[ 0,  0],
  [10, 15]]]

2 个答案:

答案 0 :(得分:0)

这就是你想要的:

import numpy as np

a = np.array([[[5., 6.]],
       [[0., 0.]],
       [[0., 0.]]])

b = np.array([[10, 15]])

c = np.insert(a,1,b,0)

print c

[[[  5.   6.]]

 [[ 10.  15.]]

 [[  0.   0.]]

 [[  0.   0.]]]

答案 1 :(得分:0)

这不是有效的numpy数组。

[[[ 5,  6],
  [10, 15]],

 [[ 0,  0]],

 [[ 0,  0]]]

它有3个'行',一个是(2,2)形状,其他是(1,2)。

如果我在列表中输入

In [40]: x = np.array([[[5,6],[10,15]],[[0,0]],[[0,0]]])
Out[40]: array([[[5, 6], [10, 15]], [[0, 0]], [[0, 0]]], dtype=object)

我得到一个dtype object的形状(3,)数组,因为它无法创建普通的3d数组。这三个对象中的每一个都只是列表列表。在np.array中包含此内容并没有太大作用。

如果我列出了3个2d数组,那可能会更有意义:

In [45]: [np.array(y) for y in x]
Out[45]: 
[array([[ 5,  6],
       [10, 15]]), 
 array([[0, 0]]), 
 array([[0, 0]])
]

问题不在于3D,而在于不规则数组,不同大小的数组。