将包含列表的一维numpy数组转换为二维数字数组,然后再将其转回原数组

3

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

>>> 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. How can I convert this to a numeric 2D array?

    >>> a.shape
    (2,)
    >>> b = WHAT_GOES_HERE(a)
    >>> b
    array([[1, 2, 3, 4],
           [5, 6, 7, 8]])
    >>> b.shape
    (2, 4)
    
  2. How can I do the reverse?

  3. Does it get easier if my a array is an np.array of np.arrays, rather than an np.array of lists?

    >>> 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)
    

@Divakar:ValueError: 在数组中设置一个序列的元素。- astype无法重新塑形。 - Eric
4个回答

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,)

很好的简洁解决方案,我曾经想过可能不得不使用for循环。 - Eric
np.shape(a[0]) 替换 -1,这样可以使得这个方法也适用于更一般的 1D 到 ND -> N+1D 的情况。 - Eric
@Eric 谢谢你的改进!已更新帖子。 - Divakar

2
你可以使用np.vstack()函数:
>>> a = np.vstack(a).astype(int)

我认为astype()也是不必要的! - Eric
是的,你说得对,虽然你最后没有明确说你想要 int(尽管在这个例子中,还能是什么呢...),所以最好保留它吧 ;) - Johannes Hinrichs
我刚才说的是数字,而在这种情况下,dtype 无论如何都是 int32。 - Eric

0

我发现使用 np.array(list(a)) 来回转换 list 就足够了。

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

这两种方法的好处是可以在更一般的情况下工作,将一个1D数组的ND数组转换为(N+1)D数组。


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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接