2017-03-28 2 views
1

からnumpyの配列を読み取る:行列とベクトルのパイソン - 私は次のようにフォーマットする入力ファイルを有するファイル

* 1 * 
[[1.0 2.0 3.0 4.0] [ 5.0 6.0 7.0 8.0]] [1.5 2.5 3.5] 

* 2 * 
[[8.0 7.0 6.0 5.0] [ 1.0 2.0 3.0 4.0]] [4.5 5.5 6.5] 

サイズは知られていません。星、行列、ベクトルの内部の数値を3つの異なる変数(it,mtxvect)に変換したいと思います。

numpy.arrayの行列とベクトルを簡単に読み取る方法があるかどうかを知りたいですか? 行列の番号がmtxで、ベクトルがvectの行の場合、星の中の数字を得ることに成功しましたが、すばやく適切な方法を見つけることができません。ここで

私はベクトルを取得しようとしているが、私はこのエラーValueError: setting an array element with a sequence.持ってる私のコードのサンプル、:誰かがベクトル(あるいは少なくともその読み方を私に言うことができる場合

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import numpy 
import re 

def read(filename): 
    it = 0 
    with open(filename, 'r') as f: 
     for line in f: 
      if line[0] == '*': 
       it += 1 

    v_it = numpy.zeros((it)).astype(numpy.int32) 
    mtx = numpy.array((it,)).astype(numpy.float32) 
    vect = numpy.array((it,)).astype(numpy.float32) 
    a = 0 
    with open(filename, 'r') as f: 
     for line in f: 
      if line[0] == '*': 
       print int(line[2:-2]) 
       v_it[a] = int(line[2:-2]) 
      elif line[:2] == '[[': 
       idx = line.index(']]') 
       line = line[idx+4:-2] 
       line = re.sub(r'\s+', ' ', line) 
       vect[a] = numpy.fromstring(line, dtype=numpy.float32, sep=' ') 
       print vect[a] 
      elif line == '': 
       a += 1 
       print a 
    print vect 

if __name__ == "__main__": 
    read('input.txt') 

を使用するlibrairy)、私は同様に行列を読むことができるはずです。 何か助けていただければ幸いです

+0

ファイル形式は何ですか? –

+0

ファイルはいくつかの結果を含むテキストファイル( '* .txt')です(単純化のために私の要求の始めに正確なフォーマットを入れています)。行列とベクトルには浮動小数点数が含まれます。星の中の数字は整数です。あなたの質問に答えてほしい – Nuageux

答えて

0

私は解決策を見つけましたので、誰かが同じ問題に対処する必要がある場合に備えて共有します。

vectnumpy.arrayから[]に変更されました。 それから私はvectの各ベクトルを1つずつ追加します。 最後に、vectnumpy.arrayにキャストします。ここで

(以前にあったものをコメントにして)変更された行:

# Before the with 
vect = [] # numpy.array((it,)).astype(object) 

# In with.for.elif 
line = line[idx+4:-2] 
l = [float(ll) for ll in line.split()] # line = re.sub(r'\s+', ' ', line) 
vect.append(numpy.array(l).astype(numpy.float32)) # numpy.fromstring([...]) 

# Outside the with 
vect = numpy.array(vect) 

終わりには、私は私の入力ファイルからのベクトルが含まれている2D numpy.arrayを得ました。

あなたもパンダを使用して、このような何かを行うことができ
0

import pandas as pd 
H = pd.read_csv('test.txt',header=None) 
blocks = H[1::2].as_matrix() 
names = H[::2].as_matrix() 
v_it = [int(i[0][2:-2]) for i in names] 
mtx = [] 
vect = [] 
for i in blocks: 
    imtx, ivect = eval(i[0].replace(' ', ',').replace('[,','[')) 
    mtx.append(imtx) 
    vect.append(ivect) 
関連する問題