如何将itertools.chain转换为numpy数组?

时间:2016-04-14 19:36:57

标签: python arrays numpy

我的代码

import math
import itertools

with open('/home/milenko/OCCAM2DMT_V3.0/13042/ITER04.iter') as f:
    lines_after_19 = f.readlines()[19:]
    p = []
    for line in lines_after_19:
        line = line.split()         
        line = [float(i) for i in line]
        p.extend(line)    

a1=p[1:81]
for i in a1:
    b1=math.pow(10, i)   
a2=p[83:163]
for i in a2:
    b2=math.pow(10,i)
a3=p[165:245]   
for i in a3:
    b3=math.pow(10,i)
a4=p[247:327]
for i in a4:
    b4=math.pow(10,i)
a5=p[329:409] 
for i in a5:
    b5=math.pow(10,i)
a6=p[411:491]
for i in a6:
    b6=math.pow(10,i)

c = itertools.chain(b1, b2, b3, b4, b5, b6) 
print type(c)

我需要将c转换为numpy数组,reshape然后进一步计算。

1 个答案:

答案 0 :(得分:6)

这被标记为重复,并引用了这个:How do I build a numpy array from a generator?问题。

使用fromiter时排名最高的答案在处理生成器时是一个不错的选择,但这并没有真正解决此问题中的问题。

如评论所述,for循环除了上次计算外不会保存任何内容。他们不必要地执行math.pow计算,这些计算也可以在numpy中完成。

暂时跳过pow位:

In [36]: ll=range(100)
In [53]: a=ll[0:20]    
In [54]: b=ll[22:40]
In [55]: c=ll[42:60]

有几种方法可以将这些组合成一个阵列;首先只是一个清单。

In [56]: len(list(itertools.chain(a,b,c)))
Out[56]: 56

该列表中的数组

In [57]: np.array(list(itertools.chain(a,b,c)))
Out[57]: 
array([ 0,  1,  2,  3,  4,  5,...., 59])

fromiter有点快;

In [58]: np.fromiter(itertools.chain(a,b,c),int)
Out[58]: 
array([ 0,  1,  2,  3,  4,  5, ... 58, 59])

concatenate也是如此 - 它将输入转换为数组并连接它们(默认为平坦):

In [59]: np.concatenate((a,b,c))
Out[59]: 
array([ 0,  1,  2,  3,  4,  5, ... 52, 53, 54,
       55, 56, 57, 58, 59])

在阵列

上执行pow计算很容易
In [62]: 10**(la/100.)
Out[62]: 
array([ 1.        ,  1.02329299,  1.04712855,  1.07151931,  1.0964782 ,
        1.12201845,  1.14815362,  1.17489755,  1.20226443,  1.23026877,
        ...
        3.4673685 ,  3.54813389,  3.63078055,  3.71535229,  3.80189396,
        3.89045145])

由于数字已从文件中读入,并且存在于列表p中,因此尝试使用生成器来节省内存并不重要。 chain在此处非常有用,只是作为创建平面列表的一种方式。

如果文件中的所有行都具有相同数量的项目,则可能已加载np.loadtxt。结果将是一个2d数组。

所有子列表的长度都是80.每行中是否有81个数字,而您正在跳过第一个?如果是这样,loadtxt数组的形状将为(N,81),您可以轻松地删除第1个切片[:, 1:]

由于你链接的所有列表都是相同的长度,你可以将它们传递给np.array而不用链。

 np.array((b1, b2, b3, b4, b5, b6))

将生成(6,80)形状的数组。不需要reshape - 除非你想要一个不同的。{/ p>