2017-05-13 10 views
0

値が9列3行に分割されたファイルtestforce.datがあります。最初の3桁は次のとおりです。列を交互に選択して配列を掛ける

p1 p2 p3 f1 f2 f3 r1 r2 r3  
18 5 27 20 21 8 14 12 25 
9 26 23 1 4 10 7 16 24 
19 22 15 13 17 6 11 2 3 

私はこのファッションの100のファイルを持っています。
ファイルforce_00000.datベクトルg = [sum(p1*f1), sum(p2*f2), sum(p3*f3)]を計算しますが、次のファイルforce_00001.datのベクトルは他の列h = [sum(p1*r1), sum(p2*r2), sum(p3*r3)]を使用する必要があります。

現時点ではglob関数を使用してファイルを配列に読み込みます。すべての行を1つの配列に格納します。 私は私の交互配列の乗算が行わ取得する方法を確認していないと任意の提案をいただければ幸いです:)

import numpy as np 
import glob 

i = 100 
for x in range(0,int(i)): 


## turns x into a string and adds if necessary "0" to achieve a fixed digit number; 
y = str(x).zfill(5) 

## the structure of the forcefile is "force_[00000-00099]"; 
files = sorted(glob.glob('.//results/force/force_%s.dat' % y)) 
column_names=('#position') 


print files 

## loads the file data into arrays 
arrays=[np.loadtxt(filename) for filename in files] 
print arrays 

編集:私は最初のファイルのロードをテストした:

b=np.array(arrays) 
print b.shape 

そして、私は(取得1,3,9)を作成しました。

EDIT2:

[[[ 360. 105. 216.] 
[ 9. 104. 230.] 
[ 247. 374. 90.]]] 

私が持っている(P11とF11を意味します。これは次の出力を生成し

xposition=[np.loadtxt(filename,usecols= (0,1,2)) for filename in files] 
xforce1=[np.loadtxt(filename,usecols= (3,4,5)) for filename in files] 
print xposition 
print xforce1 
xp=np.asarray(xposition) 
xf1=np.asarray(xforce1) 

print xp 
g=np.multiply(xp,xf1) 
print g 

:私は、所望の値を乗算し、 "usecols" を使用してする考えを持っていました最初の行の値、2番目の行からのp21 ...)

[[[p11*f11 p12*f12 p13*f13] 
[p21*f21 p22*f22 p23*f23] 
[p31*f31 p32*f32 p33*f33]]] 

私はまるでドンのようですe少なくとも1つのファイル。それは完全に初心者質問ですが、私はまだのpythonとそうfamilliarないです場合:)

問題について交互に

p11*f11+p21*f21+p31*f31= g1 
p12*f12+p22*f22+p32*f32= g2 
p13*f13+p23*f23+p33*f33= g3 

申し訳ありません:希望グラム(G1、G2、G3)は、のようになります。値ループの "i"が偶数であるかどうかをチェックするif関数の使用について考えていました

+0

1つのファイルリグに負荷をかけましょうhtの最初の。ヘッダーが正しく表示されたら、3行9列の配列になります。形状(3,9)、およびdtype of floatを指定します。それを手に入れますか? – hpaulj

+0

okもう一度チェックしました: >>> b = np。配列(配列) >>> print b.shape 私は(1,3,9)... –

答えて

0

loadtxtは配列を返します。 [loadtxt(name) for name in filenames]は、配列のリストを生成します。名前ごとに1つの配列が生成されます。 np.array([...])はそのリストから配列を生成します。個々の配列がすべて同じサイズの場合、結果の配列は3dになります。

あなたは違った他のすべてのファイルを処理するために必要がある場合は、あなたがあなたの例ファイルから列の2セットを乗算するには、インデックス

arr[::2,...] 
arr[1;:2,...] 

とセットでそれらにアクセスできます。arr場合

In [558]: txt=b"""p1 p2 p3 f1 f2 f3 r1 r2 r3  
    ...: 18 5 27 20 21 8 14 12 25 
    ...: 9 26 23 1 4 10 7 16 24 
    ...: 19 22 15 13 17 6 11 2 3""" 

In [560]: arr = np.loadtxt(txt.splitlines(),skiprows=1,dtype=int) 
In [561]: arr 
Out[561]: 
array([[18, 5, 27, 20, 21, 8, 14, 12, 25], 
     [ 9, 26, 23, 1, 4, 10, 7, 16, 24], 
     [19, 22, 15, 13, 17, 6, 11, 2, 3]]) 

In [562]: arr[:, 0:3]*arr[:, 3:6] 
Out[562]: 
array([[360, 105, 216], 
     [ 9, 104, 230], 
     [247, 374, 90]]) 

In [563]: arr[:, 0:3]*arr[:, 6:9] 
Out[563]: 
array([[252, 60, 675], 
     [ 63, 416, 552], 
     [209, 44, 45]]) 

arr1 = arr[::2,...] 
arr2 = arr[1::2,...] 
arr1[:,:,0:3] * arr1[:,:,3:6] 
etc 
+0

を取得しました。 "usecols"で今試しました。私のedit2をチェックしてください。 あなたのサポートのためにたくさんのことをありがとう:) –

+0

'usecols'は、ロード中に列を選択できるようにします。しかし、ロード後に配列から列を選択することもできます。 – hpaulj

+0

列の乗算の例が追加されました。 – hpaulj

関連する問題