将列表的numpy数组转换为numpy数组

2024-04-24 05:05:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些数据存储为带有dtype=object的numpy数组,我想提取一列列表并将其转换为numpy数组。这看起来是一个简单的问题,但是我找到的唯一解决方法是将整个事情重新转换为一个列表列表,然后将其重新转换为numpy数组。有没有更像Python的方法?在

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,因为它正在尝试将每个列表转换为字符串。在

^{pr2}$

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

arr_2 = np.array(list(arr))

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

arr_2.shape
# (2, 3)

有更好的方法吗?在


Tags: 数据方法numpy列表objecttypenp数组
2条回答

一种方法是使用类似^{}-

np.vstack(arr[:, 1])

样本运行-

^{pr2}$

我相信np.vstack会在内部使用^{}。所以,要直接使用它,我们必须-

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

虽然通过列表的方式比通过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正在执行以下操作:

^{pr2}$

一些备选方案:

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的2d特性使得选择第二列变得容易,但是arr[:,1]实际上是一个列表列表。大部分的手术都是这样处理的。像reshape这样的东西不会越过object边界。在

相关问题 更多 >