python - 将 numpy 列表数组转换为 numpy 数组

标签 python arrays numpy type-conversion

我有一些数据存储为一个带有 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)

有更好的方法吗?

最佳答案

尽管通过列表的方式比通过 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 边界。

关于python - 将 numpy 列表数组转换为 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40250501/

相关文章:

php - 按类别解释组织结果

python - 如何定义 RegularGridInterpolator 的值

python - PyhtonError导入错误: No module named six

python - 将字典转储为 json 文件作为 UTF-8

python - 在python中查找两个数组之间互斥元素的索引

java - 创建数组时堆空间不足

python - 从数组python中随机选择项目

python - 将数据文件洗牌并拆分为训练集和测试集

python - Matplotlib pandas plot_date 颜色类别

python - ffmpeg 出错,错误代码为 : -5