将1D对象numpy列表数组转换为2D数值数组并返回

时间:2016-09-22 11:14:01

标签: python numpy

假设我有这个包含相同长度列表的对象数组:

>>> a = np.empty(2, dtype=object)
>>> a[0] = [1, 2, 3, 4]
>>> a[1] = [5, 6, 7, 8]
>>> a
array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=object)
  1. 如何将其转换为数字2D数组?

    >>> a.shape
    (2,)
    >>> b = WHAT_GOES_HERE(a)
    >>> b
    array([[1, 2, 3, 4],
           [5, 6, 7, 8]])
    >>> b.shape
    (2, 4)
    
  2. 我该如何反过来?

  3. 如果我的a数组是np.array np.array,而不是np.array list,那么它会变得更容易吗?< / p>

    >>> na = np.empty(2, dtype=object)
    >>> na[0] = np.array([1, 2, 3, 4])
    >>> na[1] = np.array([5, 6, 7, 8])
    >>> na
    array([array([1, 2, 3, 4]), ([5, 6, 7, 8])], dtype=object)
    

4 个答案:

答案 0 :(得分:3)

使用np.concatenate -

的一种方法
b = np.concatenate(a).reshape(len(a),*np.shape(a[0]))

@Eric使用*np.shape(a[0])的改进建议应该使其适用于通用ND形状。

示例运行 -

In [183]: a
Out[183]: array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=object)

In [184]: a.shape
Out[184]: (2,)

In [185]: b = np.concatenate(a).reshape(len(a),*np.shape(a[0]))

In [186]: b
Out[186]: 
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

In [187]: b.shape
Out[187]: (2, 4)

要回到a,似乎我们可以使用两步流程,就像这样 -

a_back = np.empty(b.shape[0], dtype=object)
a_back[:] = b.tolist()

示例运行 -

In [190]: a_back = np.empty(b.shape[0], dtype=object)
     ...: a_back[:] = b.tolist()
     ...: 

In [191]: a_back
Out[191]: array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=object)

In [192]: a_back.shape
Out[192]: (2,)

答案 1 :(得分:1)

你可以使用np.vstack():

>>> a = np.vstack(a).astype(int)

答案 2 :(得分:0)

这是一种将源NumPy数组转换为列表然后转换为所需NumPy数组的方法:

b = np.array([k for k in a])
b
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
c = np.array([k for k in b], dtype=object)
c
array([[1, 2, 3, 4],
       [5, 6, 7, 8]], dtype=object)

答案 3 :(得分:0)

我发现使用listnp.array(list(a))进行往返就足够了。

这似乎等同于使用np.stack(a)

这两种方法都有利于将一维ND阵列数组转换为(N + 1)D阵列的更一般情况。