将Python列表转换为Numpy结构化数组?

时间:2015-03-23 23:59:43

标签: python arrays numpy

我需要将具有混合类型(整数和浮点数)的Python列表转换为具有特定列名称的Numpy结构化数组。

我尝试过以下代码但由于某些原因我无法看到它无效。

import numpy as np
lmtype = [('el','intp',1),  ('n1','intp',1),  ('n2','intp',1),  ('n3','float64',1),
          ('n4','float64',1),  ('n5','float64',1),  ('n6','float64',1),  ('n7','float64',1),
          ('n8','float64',1),  ('n9','float64',1),  ('n10','float64',1),  ('n11','float64',1)]
LAMI = np.zeros(5, dtype=lmtype)
linea = ['1', '2', '3', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0']
for idx, la in enumerate(LAMI):
    lineanum = ([ int(j) for j in linea[0:3] ] + [float(i) for i in linea[3:12] ] )
    print lineanum
    LAMI[idx] = np.array( lineanum )

代码运行,但看看LAMI里面有什么:

>>> LAMI[0]
(0, 1072693248, 0, 5.304989477e-315, 5.307579804e-315, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)

1 个答案:

答案 0 :(得分:2)

尝试:

LAMI[idx] = tuple( lineanum )

元组是分配给结构化数组的record(行)的常规方法。它们可以保持混合类型,就像结构化元素一样。

np.array(lineanum)全是floatLAMI[idx] = np.array( lineanum )只是将充满浮动的缓冲区复制到LAMI缓冲区的一段。我有点惊讶它允许这个副本;它必须做某种“复制只是适合'。 LAMI.itemsize84,而np.array(lineanum)的总长度为12 * 8 = 96。

LAMI[0]=np.array(lineanum, dtype=int) # or better
LAMI[0]=np.array(lineanum[:3], type=int)

也可以工作,因为唯一的非零值是那些被认为是整数的第3个值。