14

numpy ndarrayに列名を追加してから、名前で列を選択しようとしています。しかし、それは機能しません。名前を追加したときに問題が発生したのか、後で名前を呼び出そうとしたときに問題が発生したのかわかりません。

これが私のコードです。

data = np.genfromtxt(csv_file, delimiter=',', dtype=np.float, skip_header=1)

#Add headers
csv_names = [ s.strip('"') for s in file(csv_file,'r').readline().strip().split(',')]
data = data.astype(np.dtype( [(n, 'float64') for n in csv_names] ))

ディメンションベースの診断は、私が期待するものと一致します。

print len(csv_names)
>> 108
print data.shape
>> (1652, 108)

「printdata.dtype.names」も期待される出力を返します。

しかし、フィールド名で列を呼び出し始めると、厄介なことが起こります。「列」はまだ108列の配列です...

print data["EDUC"].shape
>> (1652, 108)

...そして、データセットの行よりも多くの欠落値が含まれているようです。

print np.sum(np.isnan(data["EDUC"]))
>> 27976

ここで何が問題になっているのでしょうか。ヘッダーの追加は簡単な操作ですが、私はこのバグと何時間も戦ってきました。ヘルプ!

4

2 に答える 2

15

問題は、スプレッドシートのような配列の観点から考えているのに対し、NumPyは異なる概念を使用していることです。

NumPyについて知っておくべきことは次のとおりです。

  1. NumPy配列には、単一タイプの要素のみが含まれます。
  2. スプレッドシートのような「列」が必要な場合、このタイプはタプルのようなタイプである必要があります。このような配列は、要素が構造体(つまりタプル)であるため、構造化配列と呼ばれます。

したがって、あなたの場合、NumPyは2次元の正規配列を取得し、タイプが108要素のタプルである1次元配列を生成します(考えているスプレッドシート配列は2次元です)。

これらの選択は、おそらく効率上の理由で行われました。配列のすべての要素は同じタイプであるため、同じサイズです。低レベルで、非常に簡単かつ迅速にアクセスできます。

ここで、user545424が示したように、実行したいことに対する単純なNumPyの答えがあります(列名を持つ引数をgenfromtxt()受け入れます)。names

配列を通常のNumPyndarrayから構造化配列に変換する場合は、次の操作を実行できます。

data.view(dtype=[(n, 'float64') for n in csv_names]).reshape(len(data))

(あなたは近くにいました:あなたはastype()代わりに使用しましたview())。

また、2D numpy配列を構造化配列に変換する方法や、通常のnumpy配列をレコード配列に変換する方法など、Stackoverflowに関するかなりの数の質問に対する回答を確認することもできます。。

于 2012-05-25T08:07:36.770 に答える
3

残念ながら、フィールド名を追加しようとすると何が起こっているのかわかりませんが、ファイルから直接必要な配列を作成できることは知っています。

data = np.genfromtxt(csv_file, delimiter=',', names=True)

編集:

フィールド名の追加は、入力がタプルのリストである場合にのみ機能するようです。

data = np.array(map(tuple,data), [(n, 'float64') for n in csv_names])
于 2012-05-24T18:15:07.280 に答える