2016-04-14 131 views
2

我的代碼如何將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,然後進一步計算。

+3

你有很多的問題,在這裏除了C'轉換'到一個數組。'c'甚至不包含你想要的數據,因爲'for'循環不會通過'b6'右邊構建'b1'。當你從文件加載數據時,轉換爲numpy的最佳時機就在你的程序的開始。 – user2357112

回答

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

這很容易在陣列

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 - 除非你想要一個不同的。