基本的に、最初の列が文字列 (ラベル) で、残りの列が数値である一連のデータがあります。私は以下を実行します:
data = numpy.genfromtxt('data.txt', delimiter = ',')
これはほとんどのデータを適切に読み取りますが、ラベル列は「nan」になります。どうすればこれに対処できますか?
デフォルトでは、次np.genfromtxt
を使用します。これdtype=float
が、文字列列が NaN に変換される理由です。結局のところ、それらは数値ではないためです...
np.genfromtxt
次を使用して、列の実際のタイプを推測するように依頼できますdtype=None
。
>>> from StringIO import StringIO
>>> test = "a,1,2\nb,3,4"
>>> a = np.genfromtxt(StringIO(test), delimiter=",", dtype=None)
>>> print a
array([('a',1,2),('b',3,4)], dtype=[('f0', '|S1'),('f1', '<i8'),('f2', '<i8')])
a['f0']
...のように、名前を使用して列にアクセスできます。
dtype=None
列がどうあるべきかわからない場合は、を使用するのが良いトリックです。それらが持つべきタイプがすでにわかっている場合は、明示的に指定できますdtype
。たとえば、このテストでは、最初の列が文字列、2 番目の列が int であり、3 番目の列が float であることがわかっています。次に使用します
>>> np.genfromtxt(StringIO(test), delimiter=",", dtype=("|S10", int, float))
array([('a', 1, 2.0), ('b', 3, 4.0)],
dtype=[('f0', '|S10'), ('f1', '<i8'), ('f2', '<f8')])
明示的な使用は、使用するdtype
よりもはるかに効率的でdtype=None
あり、推奨される方法です。
どちらの場合も (dtype=None
または明示的で非同種dtype
の場合)、構造化された配列になります。
[注: を使用dtype=None
すると、入力が 2 回解析され、各列の型が可能な限り大きな型に一致するように更新されます。最初に bool、次に int、次に float、次に complex を試し、次に文字列を保持します。他のすべてが失敗した場合。実際、実装はかなりぎこちないです。(正規表現を使用して) 型推測をより効率的にするいくつかの試みがありましたが、今のところ行き詰っているものはありません]
データファイルがこのように構成されている場合
col1, col2, col3
1, 2, 3
10, 20, 30
100, 200, 300
次にnumpy.genfromtxt
、オプションを使用して最初の行を列ヘッダーとして解釈できnames=True
ます。これにより、列ヘッダーを提供することで、非常に便利にデータにアクセスできます。
data = np.genfromtxt('data.txt', delimiter=',', names=True)
print data['col1'] # array([ 1., 10., 100.])
print data['col2'] # array([ 2., 20., 200.])
print data['col3'] # array([ 3., 30., 300.])
あなたの場合、データはこのように形成されるので
row1, 1, 10, 100
row2, 2, 20, 200
row3, 3, 30, 300
次のコード スニペットを使用して、同様のことを実現できます。
labels = np.genfromtxt('data.txt', delimiter=',', usecols=0, dtype=str)
raw_data = np.genfromtxt('data.txt', delimiter=',')[:,1:]
data = {label: row for label, row in zip(labels, raw_data)}
最初の行は、最初の列 (ラベル) を文字列の配列に読み込みます。2 行目はファイルからすべてのデータを読み取りますが、最初の列は破棄します。3 行目は辞書内包表記を使用して、オプションnumpy.genfromtxt
を使用して作成する構造化配列と非常によく似た辞書を作成します。names=True
print data['row1'] # array([ 1., 10., 100.])
print data['row2'] # array([ 2., 20., 200.])
print data['row3'] # array([ 3., 30., 300.])
以下は、開始から終了までの実際の例です。
最初の行のないファイルから数値をインポートする場合:
I like trains #this is the first line, a string
1 \t 2 \t 3 #\t is to signify that the delimeter (separation) is tab and not komma
4 \t 5 \t 6
次に、次のコードを実行します。
import numpy as np #contains genfromtxt
import matplotlib.pyplot as plt #enables plots
from pathlib import Path # easier using path instead of writing it again and again when you have many files in the same folder
path = r'some_path' #location of your file in your computer like r'C:my comp\folder\folder2' r is there to make the win 10 path readable in python, it means "just text"
fileNames = [r'\I like trains.txt',
r'\die potato.txt']
data=np.genfromtxt(path + fileNames[0], delimiter='\t', skip_header=1)
次の結果が生成されます。
data = [1 2 3
4 5 6]
各番号には独自のセルがあり、個別に到達できます