如何将itertools.chain转换为numpy数组?
问题描述:
我的代码如何将itertools.chain转换为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
,然后进一步计算。
答
这被标记为与参考此重复: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])
这很容易在阵列
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])
上执行pow
计算由于数字已从文件中读入,并出现在列表p
中,因此尝试通过使用基因组来节省内存没有太大意义要么。 chain
在这里用作创建平面列表的一种方式。
如果文件中的所有行有相同数量的项目,它可能已经装载了np.loadtxt
。结果将是一个2d数组。
你的所有子列表的长度都是80是否有81号的每一行,而你跳过第一?如果是这样,loadtxt
阵列的形状将为(N,81)
,并且您可以轻松地将第一个分割为[:, 1:]
。
因为所有你链上的名单,你可以刚刚通过那些np.array
无链的长度相同。
np.array((b1, b2, b3, b4, b5, b6))
会产生一个(6,80)
形状的阵列。没有必要reshape
- 除非你想要一个不同的。
你有很多的问题,在这里除了C'转换'到一个数组。'c'甚至不包含你想要的数据,因为'for'循环不会通过'b6'右边构建'b1'。当你从文件加载数据时,转换为numpy的最佳时机就在你的程序的开始。 – user2357112