はじめに
python3をwindows10上で動かしており、とあるデータ処理をpythonで書いている途中でつまづいたので、ここでメモしておきます
データを取り出してグラフ表示
以下のようなテキストファイルからy軸、x軸の値をそれぞれ取り出してグラフ表示するために、pythonでプログラミングしているところでわからないことが出てきました。それが、以下にあるgenfromtxtの配列の扱いです。
0.1 , 1
0.4 , 2
0.1 , 3
0.8 , 4
0.6 , 5
0.3 , 6
...
genfromtxt
numpyのライブラリの中にテキストファイルからデータを簡単に取り出すことのできるfenfromtxtというものがありました。以下に例となるコードを示しておきます。
import numpy as np
import matplotlib.pylab as plt
data=np.genfromtxt('mass.txt',delimiter=',')
x=data[:,0]
y=data[:,1]
plt.plot(x,y,label="data")
plt.legend()
plt.show
これはデータを取り込む部分とグラフ表示の部分を抜き出したものですが、genfromtxtの部分だけ取り出すと、以下のようになります。
data=np.genfromtxt('mass.txt',delimiter=',')
x=data[:,0]
y=data[:,1]
mass.txtファイルから","区切りでデータを読み込み、スライスでy軸、x軸それぞれの値を取り込んでいます。
ここで、もともとデータをリストにfloatで取り出しているため、
list=[[0.1 , 1] [0.4 , 2]...]
x=list[:,0]
y=list[:,1]
と書いたところTypeErrorとなり、
TypeError: list indices must be integers or slices, not tuple
と表示されてしまいました。
どうして、タプル扱いになったのか見当もつかなかったためとりあえず、data=genfromtxtのdataを出力させてみると、
[[0.1 1. ]
[0.4 2. ]
...,
[0.6 5. ]
[0.3 6. ]]
と表示されました。この配列表記は文字列でもなく、要素間に","もないためどういう宣言をしたらこういう出力結果になるのかわかっていません...
とりあえず、ここまで頭を整理させるために書きました。また、わかったら編集しなおします。
@LouiS0616 さんにコメントで教えていただきました。感謝します。
genfromtxtによる配列はnumpyのndarryという多次元配列を用いており、pythonに組み込まれているリストとは出力結果自体も少し異なるみたいです。実際に自分でもやってみたのですが、配列の出力には","が入っていませんでした。numpyの配列はメモリ上に連続的に入れられるため変更不可ってことは、知っていたのですが、出力結果や使える文法も違うことは知りませんでした…
出力結果
[0 1]
import numpy as np
a=np.array([0,1])
print(a)
自分はもともとpythonに組み込まれているリストを使いたかったのでfor文で書くことにします。
以下、@shiracamus さんに教えていただいたfor文でも1行で2次元配列の列だけを新しくリストに取り出す方法
出力結果
[1, 3, 5, 7, 9, 11] [2, 4, 6, 8, 10, 12]
data=[[1,2],[3,4],[5,6],[7,8],[9,10],[11,12]]
x=[d[0] for d in data]
y=[d[1] for d in data]
print(x)
print(y)
リストを作り、その中でfor文を回せるなんて初めて知りました
感謝します。