2016-04-14 5 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) 

私はreshape、その後、更なる計算のために、numpy配列にCを変換する必要があります。

+3

ここでは、 'c'を配列に変換する以外にも多くの問題があります。'for'ループは' b1'から 'b6'を構築していないので、' c'はあなたが望むデータを含んでいません。 numpyに変換するのに最適な時間は、ファイルからデータをロードするときに、プログラムの開始時です。 – user2357112

答えて

6

これは、これと関連して重複としてマークされました:How do I build a numpy array from a generator?質問。

最高ランクの回答は、fromiterを使用するとよいでしょうが、この質問の問題は実際には解決していません。

コメントとして、forループは最後の計算を除いて何も保存しません。そして彼らはnumpyでやり遂げることができるmath.pow計算を不必要に実行します。今のpowビットをスキップ

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

私は1つのアレイにこれらを組み合わせることができ、いくつかの方法があります。まずリストだけ。

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に存在するため、generatを使用してメモリを節約しようとするのはあまり意味がありませんまたは。 chainは、フラットリストを作成する方法と同様に便利です。

ファイル内のすべての行のアイテム数が同じ場合は、np.loadtxtがロードされている可能性があります。結果は2次元配列になります。

すべてのサブリストの長さは80です。各行に81の数字がありますか?最初のものはスキップしていますか?その場合、loadtxtの配列は(N,81)の形になりますので、スライス[:, 1:]で簡単に第1を削除できます。あなたがチェーンのすべてのリスト以来


はあなただけでチェーンなしnp.arrayにそれらを通過している可能性が同じ長さです。

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

は、(6,80)形状のアレイを生成するであろう。 reshapeへの必要はありません - あなたが別のものを必要としない限り。