我想将一个二维数组转换为带有命名字段的结构化数组。我希望二维数组中的每一行都成为结构化数组中的一条新记录。不幸的是,我尝试过的所有方法都没有按照我的预期工作。
我从以下内容开始:
>>> 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。我需要一种高性能且优雅的解决方案,适用于各种一般情况,因为我将针对大量不同的应用程序进行这种类型的转换。
谢谢!
fromrecords
可以避免使用transpose()
。 - Ruggero Turra