【发布时间】:2016-02-03 10:50:00
【问题描述】:
我正在尝试将 SQL 中的一些数据(使用 pyodbc)读取到一个 numpy 结构化数组中(我相信由于有多种 dtype,需要一个结构化数组)。
import pyodbc
import numpy as np
cnxn = pyodbc.connect('DRIVER={SQL Server};Server=SERVER;Database=DB;Trusted_Connection=Yes;')
cursor = cnxn.cursor()
sql_ps = "select a, b from table"
cursor.execute(sql_positions)
p_data = cursor.fetchall()
cnxn.close
ndtype = np.dtype([('f1','>f8'),('f2','|S22')])
p_data = np.asarray(p_data, dtype=ndtype)
但是这会返回:
TypeError: expected a readable buffer object
如果我作为元组加载到数组中
p_data_tuple = np.asarray([tuple(i) for i in p_data], dtype=ndtype)
它可以工作,但是 p_data_tuple 是一个元组数组,而不是二维数组,这意味着我不能使用 p_data_tuple[0,1] 调用元素
有谁知道如何将返回的数据直接放入具有多个 dtype 的 str 数组中,或者将元组数组转换为多个 dtype 的二维数组,或其他解决方案?
谢谢
【问题讨论】:
-
如果通过 pandas 运行查询会发生什么:
df = pd.read_sql_query(sql_ps, cnxn) -
我可以接受它,然后使用
p_data_2 = df.asmatrix(['a','b'])将返回值转换为数组,但似乎不允许我指定 dtype,对于p_data_2将是object。 -
“它可以工作,但是 p_data_tuple 是一个元组数组,而不是二维数组,这意味着我不能使用 p_data_tuple[0,1] 调用元素”当您创建结构化数组时会发生这种情况。它将是一个一维结构数组。如果结构中字段的数据类型不完全相同,则不能将其作为二维数组访问。
-
您通过数据类型名称访问“列”,例如
data['f1']。并按编号记录,data[0]。 -
感谢 Warren,所以大概唯一的解决方案是将数据读入数组
p_data = np.asarray(p_data),然后将其分割成具有相同 dtypes 的数组
标签: python arrays numpy pyodbc