Skip to main content
 首页 » 编程设计

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

2025年05月04日18luoye11

我的代码

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]) 

很容易执行 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 .结果将是一个二维数组。

所有子列表的长度都是 80。每行中是否有 81 个数字,而您跳过了第一个?如果是这样,loadtxt数组将是 (N,81)形状,你可以很容易地用切片去掉第一个[:, 1:] .


由于您链接的所有列表的长度都相同,您可以将它们传递给 np.array无链。

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

会产生 (6,80)形阵列。不需要 reshape - 除非你想要一个不同的。