您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何将具有对象dtype的Numpy 2D数组转换为浮点数的常规2D数组

如何将具有对象dtype的Numpy 2D数组转换为浮点数的常规2D数组

讨厌的小问题…我一直在愚弄这个玩具示例:

>>> arr = np.array([['one', [1, 2, 3]],['two', [4, 5, 6]]], dtype=np.object)
>>> arr
array([['one', [1, 2, 3]],
       ['two', [4, 5, 6]]], dtype=object)

我的第一个猜测是:

>>> np.array(arr[:, 1])
array([[1, 2, 3], [4, 5, 6]], dtype=object)

但这保留了objectdtype,所以也许这样:

>>> np.array(arr[:, 1], dtype=np.float)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: setting an array element with a sequence.

通常,您可以执行以下操作来解决此问题:

>>> np.array(arr[:, 1], dtype=[('', np.float)]*3).view(np.float).reshape(-1, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected a readable buffer object

不过不在这里,这有点令人困惑。显然是数组中的对象是列表这一事实,使之成为现实,因为用元组替换列表是可行的:

>>> np.array([tuple(j) for j in arr[:, 1]],
...          dtype=[('', np.float)]*3).view(np.float).reshape(-1, 3)
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])

由于似乎没有完全令人满意的解决方案,因此最简单的方法可能是:

>>> np.array(list(arr[:, 1]), dtype=np.float)
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])

尽管这不是很有效,但最好采用以下方法

>>> np.fromiter((tuple(j) for j in arr[:, 1]), dtype=[('', np.float)]*3,
...             count=len(arr)).view(np.float).reshape(-1, 3)
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])
其他 2022/1/1 18:36:03 有486人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶