2016-08-08 5 views
0

SQLでクエリを実行するデータセットがあります。私のクエリは、列名とデータを含む長い文字列を返します。行は改行文字で区切られています。次に、numpy.genfromtxtを使用して、この長い文字列をnumpy配列に変換します。NumPyを使用してSQLデータベースから文字列を正しく読み取る方法

ただし、文字列として読み取る必要がある列がいくつかあります。したがって、私は明示的にdtype配列をgenfromtxtに渡しているので、列の値が正しく保存されます。しかし、出力を調べると、文字列でなければならないすべての列エントリは、単に空の文字列の''として表示されます。

これらの列のデータ型をstrと宣言しています。たとえば、空の文字列に変換されるエントリの1つは、元のデータセットではGALAXYという単語です。ただし、データセットの公式ドキュメントには、この列のデータ型がvarcharであることが記載されています。私はstrがこのタイプに適していると仮定しましたが、そうは思わないでしょう。


編集:これはSQLとの何かを持っていることを無視します。基本的に、私はクエリの結果である文字列を持っており、np.genfromtxtを使用してそれをnumpy配列にパックする必要があります。私は、彼らが見て残酷であるため、明示的な文字列を掲示避けますが、ここでは1です:

b'bestObjID,ra,dec,z,zErr,zWarning,class,subClass,rChi2,DOF,rChi2Diff,z_noqso,zErr_noqso,zWarning_noqso,class_noqso,subClass_noqso,rChi2Diff_noqso,velDisp,velDispErr,velDispZ,velDispZErr,velDispChi2\n1237662340012638224,239.58334,27.233419,0.09080672,2.924875E-05,0,GALAXY,,1.104714,3735,1.411605,0,0,0,,,0,272.6187,13.61222,0,0,1815.653\n'

あなたが見ることができるように、それは\nで区切られた行とbytesオブジェクトであり、最初の行に列であることラベル。

np.genfromtxtにこれを渡した結果は

array((1237662340012638224, 239.58334, 27.233419, 0.09080672264099121, 2.9248749342514202e-05, 0, '', '', 1.104714035987854, 3735.0, 1.4116050004959106, 0.0, 0.0, 0, '', '', 0.0, 272.61871337890625, 13.61221981048584, 0.0, 0.0, 1815.6529541015625), dtype=[('bestObjID', '<i8'), ('ra', '<f8'), ('dec', '<f8'), ('z', '<f4'), ('zErr', '<f4'), ('zWarning', '<i8'), ('class', '<c16'), ('subClass', '<c16'), ('rChi2', '<f4'), ('DOF', '<f4'), ('rChi2Diff', '<f4'), ('z_noqso', '<f4'), ('zErr_noqso', '<f4'), ('zWarning_noqso', '<i8'), ('class_noqso', '<c16'), ('subClass_noqso', '<c16'), ('rChi2Diff_noqso', '<f4'), ('velDisp', '<f4'), ('velDispErr', '<f4'), ('velDispZ', '<f4'), ('velDispZErr', '<f4'), ('velDispChi2', '<f4')])

あなたは、私がこのエントリのデータ型がstrであることを指定したときに'GALAXY'''に変身何を言うべきかを確認することができます。私が代わりにc dataypeを使用すると、GGALAXYですが、これ以上回復することはできません。 c8またはc16を使用しようとすると、(nan+0j)

+0

あなたの質問は非常に誤解聞こえる - 'numpy'ライブラリはDBAPIとして使用されるものではありません。通常のSQLデータベースからデータを操作/読み込みする場合、結果を 'numpy'で解析しようとするとどうしたのかを明確にすることはできますか?おそらくあなたの本当の問題がどこにあるかは分かります。また、[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を使って問題を書く方法をお読みになりたい場合もあります。 – Thtu

+0

@ThomasTuこれは私のことに非常に特有です取りかかっている。私はSDSSウェブサイトで提供されているPythonスクリプトを使用して、SDSS(Sloan Digital Sky Survey)からデータを照会しています。このスクリプトはクエリを実行し、最初の段落で説明したように文字列を返します。多分私はSQLを言及すべきではないでしょう、私の問題は本当にエントリを 'numfromtxt'で' numpy'配列に変換するだけです。私はいくつかの詳細と投稿を更新します – Anonymous

+0

[astropy/astroquery](http://astroquery.readthedocs.io/ja/latest/sdss/sdss.html)は、あなたのために何をしようとしていますか?そうでない場合は、mcveを投稿しようとすると、おそらくもっと役に立つ答えが得られます。 – Thtu

答えて

1

私はgenfromtxtの使い方を推測していますが、これはうまくいくと思われますか?

import numpy as np 
from StringIO import StringIO 

s = b'bestObjID,ra,dec,z,zErr,zWarning,class,subClass,rChi2,DOF,rChi2Diff,z_noqso,zErr_noqso,zWarning_noqso,class_noqso,subClass_noqso,rChi2Diff_noqso,velDisp,velDispErr,velDispZ,velDispZErr,velDispChi2\n1237662340012638224,239.58334,27.233419,0.09080672,2.924875E-05,0,GALAXY,,1.104714,3735,1.411605,0,0,0,,,0,272.6187,13.61222,0,0,1815.653\n' 

S = lambda : StringIO(s) 

np.genfromtxt(S(), dtype = None, names=True, delimiter=',') 

出力

array((1237662340012638224, 239.58334, 27.233419, 0.09080672, 2.924875e-05, 0, 'GALAXY', False, 1.104714, 3735, 1.411605, 0, 0, 0, False, False, 0, 272.6187, 13.61222, 0, 0, 1815.653), 
    dtype=[('bestObjID', '<i8'), ('ra', '<f8'), ('dec', '<f8'), ('z', '<f8'), ('zErr', '<f8'), ('zWarning', '<i8'), ('class', 'S6'), ('subClass', '?'), ('rChi2', '<f8'), ('DOF', '<i8'), ('rChi2Diff', '<f8'), ('z_noqso', '<i8'), ('zErr_noqso', '<i8'), ('zWarning_noqso', '<i8'), ('class_noqso', '?'), ('subClass_noqso', '?'), ('rChi2Diff_noqso', '<i8'), ('velDisp', '<f8'), ('velDispErr', '<f8'), ('velDispZ', '<i8'), ('velDispZErr', '<i8'), ('velDispChi2', '<f8')]) 
+0

ありがとう、これは合法です私はまだデータ型を明示的に宣言し、文字列に 'a8'を使用しました。 – Anonymous

関連する問題