我有一个数据集,正在使用 SQL 查询。我的查询返回一个长字符串,其中仅包含列名称,然后是数据,行由换行符分隔。然后我使用 numpy.genfromtxt
将这个长字符串转换为 numpy 数组。
但是,有几列应该作为字符串读取。因此,我明确传递 dtype
数组到genfromtxt
以便它正确保存列值。但是,当我检查输出时,所有应该是字符串的列条目都简单地显示为 ''
,一个空字符串。
我将这些列的数据类型声明为 str
。例如,在原始数据集中,一个变成空字符串的条目是单词GALAXY
。 。然而,在数据集的官方文档上,列出该列的数据类型为 varchar
。我假设str
这是正确的类型,但我想不是。
编辑:忽略这与 SQL 有何关系。基本上,我有一个查询结果的字符串,我需要使用 np.genfromtxt
将其打包到 numpy 数组中。我避免发布显式字符串,因为它们看起来很残酷,但这里有一个:
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'
如您所见,它是 bytes
行由 \n
分隔的对象第一行是列标签。
将其传递给 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')])
你可以看看应该怎么说'GALAXY'
变成 ''
当我指定该条目的数据类型为str
时。如果我改用 c
数据类型,我可以恢复 G
的GALAXY
,但仅此而已。如果我尝试使用 c8
或c16
,我得到(nan+0j)
最佳答案
我猜你是如何使用 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')])
关于python - 如何使用 NumPy 正确从 SQL 数据库读取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38837569/