python - 将 2D numpy 数组转换为结构化数组

标签 python numpy

我正在尝试将二维数组转换为具有命名字段的结构化数组。我希望二维数组中的每一行都是结构化数组中的新记录。不幸的是,我所尝试的一切都没有达到我的预期。

我开始:

>>> myarray = numpy.array([("Hello",2.5,3),("World",3.6,2)])
>>> print myarray
[['Hello' '2.5' '3']
 ['World' '3.6' '2']]

我想转换成这样的东西:

>>> newarray = numpy.array([("Hello",2.5,3),("World",3.6,2)], dtype=[("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[('Hello', 2.5, 3L) ('World', 3.6000000000000001, 2L)]

我尝试过的:

>>> newarray = myarray.astype([("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[[('Hello', 0.0, 0L) ('2.5', 0.0, 0L) ('3', 0.0, 0L)]
 [('World', 0.0, 0L) ('3.6', 0.0, 0L) ('2', 0.0, 0L)]]

>>> newarray = numpy.array(myarray, dtype=[("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[[('Hello', 0.0, 0L) ('2.5', 0.0, 0L) ('3', 0.0, 0L)]
 [('World', 0.0, 0L) ('3.6', 0.0, 0L) ('2', 0.0, 0L)]]

这两种方法都试图将 myarray 中的每个条目转换为具有给定 dtype 的记录,因此会插入额外的零。我不知道如何让它将每一行转换为记录。

另一个尝试:

>>> newarray = myarray.copy()
>>> newarray.dtype = [("Col1","S8"),("Col2","f8"),("Col3","i8")]
>>> print newarray
[[('Hello', 1.7219343871178711e-317, 51L)]
 [('World', 1.7543139673493688e-317, 50L)]]

这次没有执行实际的转换。内存中的现有数据只是被重新解释为新的数据类型。

我开始使用的数组是从文本文件中读取的。数据类型不提前知道,所以我不能在创建的时候设置dtype。我需要一个适用于一般情况的高性能且优雅的解决方案,因为我将多次为各种应用程序进行这种类型的转换。

谢谢!

最佳答案

您可以使用 numpy.core.records.fromarrays“从(平面)数组列表创建记录数组”。如下:

>>> import numpy as np
>>> myarray = np.array([("Hello",2.5,3),("World",3.6,2)])
>>> print myarray
[['Hello' '2.5' '3']
 ['World' '3.6' '2']]


>>> newrecarray = np.core.records.fromarrays(myarray.transpose(), 
                                             names='col1, col2, col3',
                                             formats = 'S8, f8, i8')

>>> print newrecarray
[('Hello', 2.5, 3) ('World', 3.5999999046325684, 2)]

我正在尝试做类似的事情。我发现当 numpy 从现有的二维数组(使用 np.core.records.fromarrays)创建结构化数组时,它会将二维数组中的每一列(而不是每一行)视为一条记录。所以你必须转置它。 numpy 的这种行为似乎不是很直观,但也许有一个很好的理由。

关于python - 将 2D numpy 数组转换为结构化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3622850/

相关文章:

python-3.x - ValueError:无法将字符串转换为 float ,Python

python - heroku python3 : ImportError: No module named 'encodings'

python - Tkinter 中的事件指示器?

python获取每个成员只出现一次的组合组

python - pandas 到 numpy 数组用于 sklearn 管道

Python fsolve() 提示形状。为什么?

python - 删除字符串两端的子字符串

python - 如何确定多个外键中SQL插入的顺序?

python - 如何接受包含空格的角色名称?

python - 在 Python 与 Matlab 中减去 3D numpy 数组