【问题标题】:Convert a numpy array of lists to a numpy array将 numpy 列表数组转换为 numpy 数组
【发布时间】:2017-03-08 02:59:23
【问题描述】:

我有一些数据存储为带有dtype=object 的 numpy 数组,我想提取一列列表并将其转换为 numpy 数组。这似乎是一个简单的问题,但我发现解决它的唯一方法是将整个事物重铸为列表列表,然后将其重铸为 numpy 数组。有没有更 Pythonic 的方法?

import numpy as np

arr = np.array([[1, ['a', 'b', 'c']], [2, ['a', 'b', 'c']]], dtype=object)
arr = arr[:, 1]

print(arr)
# [['a', 'b', 'c'] ['a', 'b', 'c']]

type(arr)
# numpy.ndarray
type(arr[0])
# list

arr.shape
# (2,)

将数组重铸为dtype=str 会引发ValueError,因为它试图将每个列表转换为字符串。

arr.astype(str)
# ValueError: setting an array element with a sequence

可以将整个数组重建为列表列表,然后将其转换为 numpy 数组,但这似乎是一种迂回的方式。

arr_2 = np.array(list(arr))

type(arr_2)
# numpy.ndarray
type(arr_2[0])
# numpy.ndarray

arr_2.shape
# (2, 3)

有没有更好的方法来做到这一点?

【问题讨论】:

  • 对象数组只不过是一个美化(或贬低)的列表。数组的元素是指向这些列表对象的指针。这种数组上的大多数操作都涉及列表迭代。

标签: python arrays numpy type-conversion


【解决方案1】:

一种方法是使用诸如np.vstack 之类的堆叠操作-

np.vstack(arr[:, 1])

示例运行 -

In [234]: arr
Out[234]: 
array([[1, ['a', 'b', 'c']],
       [2, ['a', 'b', 'c']]], dtype=object)

In [235]: arr[:,1]
Out[235]: array([['a', 'b', 'c'], ['a', 'b', 'c']], dtype=object)

In [236]: np.vstack(arr[:, 1])
Out[236]: 
array([['a', 'b', 'c'],
       ['a', 'b', 'c']], 
      dtype='|S1')

我相信np.vstack 会在内部使用np.concatenate。所以,要直接使用它,我们需要 -

np.concatenate(arr[:, 1]).reshape(len(arr),-1)

【讨论】:

    【解决方案2】:

    虽然通过列表的方式比通过vstack 更快:

    In [1617]: timeit np.array(arr[:,1].tolist())
    ...
    100000 loops, best of 3: 11.5 µs per loop
    In [1618]: timeit np.vstack(arr[:,1])
    ...
    10000 loops, best of 3: 54.1 µs per loop
    

    vstack 正在做:

    np.concatenate([np.atleast_2d(a) for a in arr[:,1]],axis=0)
    

    一些替代方案:

    In [1627]: timeit np.array([a for a in arr[:,1]])
    100000 loops, best of 3: 18.6 µs per loop
    In [1629]: timeit np.stack(arr[:,1],axis=0)
    10000 loops, best of 3: 60.2 µs per loop
    

    请记住,对象数组只包含指向内存中其他位置的列表的指针。虽然arr 的二维特性使得选择第二列变得容易,但arr[:,1] 实际上是一个列表列表。并且对它的大多数操作都是这样对待它的。 reshape 之类的东西不要越过 object 的边界。

    【讨论】:

      猜你喜欢
      • 2019-08-30
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      相关资源
      最近更新 更多