回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在尝试将二维数组转换为具有命名字段的结构化数组。我希望2D数组中的每一行都是结构化数组中的新记录。不幸的是,我所做的一切都没有达到我的预期。</p>
<p>我先说:</p>
<pre><code>>>> myarray = numpy.array([("Hello",2.5,3),("World",3.6,2)])
>>> print myarray
[['Hello' '2.5' '3']
['World' '3.6' '2']]
</code></pre>
<p>我想转换成这样:</p>
<pre><code>>>> 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)]
</code></pre>
<p>我试过的:</p>
<pre><code>>>> 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)]]
</code></pre>
<p>这两种方法都试图将myarray中的每个条目转换为具有给定数据类型的记录,因此会插入额外的零。我不知道如何使它把每一行转换成一个记录。</p>
<p>另一次尝试:</p>
<pre><code>>>> newarray = myarray.copy()
>>> newarray.dtype = [("Col1","S8"),("Col2","f8"),("Col3","i8")]
>>> print newarray
[[('Hello', 1.7219343871178711e-317, 51L)]
[('World', 1.7543139673493688e-317, 50L)]]
</code></pre>
<p>这次不执行实际转换。内存中现有的数据只是重新解释为新的数据类型。</p>
<p>我开始使用的数组是从文本文件读入的。数据类型不是提前知道的,所以我不能在创建时设置数据类型。我需要一个高性能和优雅的解决方案,这将很好地工作在一般情况下,因为我将做这种类型的转换很多,很多次为各种各样的应用程序。</p>
<p>谢谢!</p>