web-dev-qa-db-ja.com

Python)のテキストファイルからデータと変数名をインポートする

シミュレーションデータ(60列、100k行)を含むテキストファイルがあります。

a  b   c  
1  11 111
2  22 222
3  33 333
4  44 444

...ここで、最初の行は変数名で、その下(列)は対応するデータ(フロートタイプ)です。

さらに計算するには、これらすべての変数をデータとともにPythonに使用する必要があります。たとえば、次のように挿入すると、

print(b)

2番目の列から値を受け取る必要があります。

データをインポートする方法を知っています:

data=np.genfromtxt("1.txt", unpack=True, skiprows = 1)

変数を「手動で」割り当てます。

a,b,c=np.genfromtxt("1.txt", unpack=True, skiprows = 1)

しかし、変数名の取得に問題があります。

reader = csv.reader(open("1.txt", "rt"))
for row in reader: 
   list.append(row)
variables=(list[0])  

このコードを変更して、最初の行からすべての変数名を取得し、インポートされた配列に割り当てるにはどうすればよいですか?

4
Michal

名前を割り当てようとする代わりに、 連想配列 の使用を検討することもできます。これは、Python として知られています。 )dict 、変数とその値を格納します。コードは次のようになります( csv docs ):

import csv
with open('1.txt', 'rt') as f:
  reader = csv.reader(f, delimiter=' ', skipinitialspace=True)

  lineData = list()

  cols = next(reader)
  print(cols)

  for col in cols:
    # Create a list in lineData for each column of data.
    lineData.append(list())


  for line in reader:
    for i in xrange(0, len(lineData)):
      # Copy the data from the line into the correct columns.
      lineData[i].append(line[i])

  data = dict()

  for i in xrange(0, len(cols)):
    # Create each key in the dict with the data in its column.
    data[cols[i]] = lineData[i]

print(data)

dataには、data['varname']を介してアクセスできる各変数が含まれます。

したがって、たとえば、質問で提供された入力を指定して、data['a']を実行してリスト['1', '2', '3', '4']を取得できます。

ドキュメント内のデータに基づいて名前を作成しようとすることは、上記のdictベースの方法と比較して、これを行うにはかなり厄介な方法かもしれないと思います。ただし、本当にそれを実行したい場合は、Python(私が本当に何も知らない主題)の 反射 を調べることができます) 。

2
andyg0808

答えは:あなたはそれをしたくない

辞書はまさにこの目的のために設計されています:あなたが実際に望むデータ構造は次のようになります:

data = {
    "a": [1, 2, 3, 4],
    "b": [11, 22, 33, 44],
    "c": [111, 222, 333, 444],
}

...次に、たとえばを使用して簡単にアクセスできます。 data["a"]

やりたいことをするのは可能ですが、通常の方法はPythonが使用するという事実に依存するハックです(drumroll)変数を格納するためのdict内部-そしてコードはそれらの変数の名前を知らないので、辞書アクセスを使用して立ち往生しますそれらも取得してください...したがって、最初に辞書を使用する方がよいでしょう。

これはPythonでは故意に難しくなっていることを指摘する価値があります。コードが変数の名前を知らない場合、それらは定義上データであるためです。論理ではなく、そのように扱う必要があります。

まだ確信が持てない場合のために、このテーマに関する優れた記事を以下に示します。

愚かなPythonアイデア:変数を動的に作成したくない理由

2
Zero Piraeus

変数名とデータの.txtファイルをNumPy配列に変換する簡単な方法は次のとおりです。

D = np.genfromtxt('1.txt',dtype='str')    # load the data in as strings
D_data = np.asarray(D[1::,:],dtype=float) # convert the data to floats
D_names = D[0,:]                          # save a list of the variable names

for i in range(len(D_names)):
    key = D_names[i]                      # define the key for this variable 
    val = D_data[:,i]                     # set the value for this variable 
    exec(key + '=val')                    # build the variable  code here

従うのが簡単で、メンテナンスが簡単なので、この方法が好きです。このコードは次のように圧縮できます。

D = np.genfromtxt('1.txt',dtype='str')     # load the data in as strings
for i in range(D.shape[1]):
    val = np.asarray(D[1::,i],dtype=float) # set the value for this variable 
    exec(D[0,i] + '=val')                  # build the variable 

どちらのコードも同じことを行い、a、b、cという名前のNumPy配列とそれに関連するデータを返します。

0
Austin Downey

@ andyg0808と@ZeroPiraeusのおかげで、私は別の解決策を見つけました。私にとって最も適切なのは、Pandasデータ分析ライブラリを使用することです。

   import pandas as pd

   data=pd.read_csv("1.txt",
           delim_whitespace=True,
           skipinitialspace=True)

  result=data["a"]*data["b"]*3
  print(result)

  0     33
  1    132
  2    297
  3    528

...ここで、0、1、2、3は行インデックスです。

0
Michal