拆分嵌套的numpy数组

时间:2018-06-12 15:58:14

标签: python arrays numpy

我有一个28 x 1875的numpy数组。每个元素都是一个3元素列表(只有浮点数)。我需要将这些元素中的每一个分成单独的元素,以获得28x5625(1875 * 3)形状的数组。我已经尝试了np.split,但它只分隔每个元素,但没有每个子元素。有没有快速的方法来做到这一点?

1 个答案:

答案 0 :(得分:2)

制作2d列表:

In [522]: arr = np.empty(6,object)
In [523]: arr[:] = [list(range(i,i+3)) for i in range(6)]
In [524]: arr = arr.reshape(2,3)
In [525]: arr
Out[525]: 
array([[list([0, 1, 2]), list([1, 2, 3]), list([2, 3, 4])],
       [list([3, 4, 5]), list([4, 5, 6]), list([5, 6, 7])]], dtype=object)

如果它是1d,填充这样的数组会更容易,这就是为什么我从(6,)开始并重新整形后的原因。

Paul Panzer的建议:

In [526]: np.array(arr.tolist())
Out[526]: 
array([[[0, 1, 2],
        [1, 2, 3],
        [2, 3, 4]],

       [[3, 4, 5],
        [4, 5, 6],
        [5, 6, 7]]])
In [527]: _.reshape(2,-1)
Out[527]: 
array([[0, 1, 2, 1, 2, 3, 2, 3, 4],
       [3, 4, 5, 4, 5, 6, 5, 6, 7]])

您还可以使用np.stacknp.concatenate的版本)来创建数组。但它确实需要1d对象数组 - 因此ravel

In [536]: np.stack(arr.ravel())
Out[536]: 
array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4],
       [3, 4, 5],
       [4, 5, 6],
       [5, 6, 7]])

可以根据需要重新塑造:

In [537]: np.stack(arr.ravel()).reshape(2,-1)
Out[537]: 
array([[0, 1, 2, 1, 2, 3, 2, 3, 4],
       [3, 4, 5, 4, 5, 6, 5, 6, 7]])

在某些情况下,我们需要transpose轴来获得所需的顺序。