更正 - 要使用来自 fetchall 的元组列表,dtype 应该生成结构化数组
查看文档,我看到fetch_all 返回的是元组列表,而不是生成器。但这不是这里的问题。两者都是可迭代的。问题出在dtype上。要从元组列表中创建一维数组,fromiter 需要结构化的复合 dtype。
此 dtype 适用于 1 元素元组:
In [355]: np.fromiter([(1,)],dtype=[('f0','i4')])
Out[355]:
array([(1,)], dtype=[('f0', '<i4')])
这适用于 2 个字段(列)
In [356]: np.fromiter([(1,1)],dtype=('i4,i4'))
Out[356]:
array([(1, 1)], dtype=[('f0', '<i4'), ('f1', '<i4')])
但它们是相同的 - 一个普通的非结构化数组。
np.fromiter([(1,)],dtype=('i4'))
np.fromiter([(1,)],dtype=int)
[(1,)] 的处理方式与 [[1]] 相同,它是二维数组的输入,而不是 fromiter 期望的一维迭代。
np.array 与 fromiter 在结构化案例中的作用相同:
np.array([(1,)],dtype=[('f0','i4')])
np.array([(1,1)],dtype=('i4,i4'))
它也适用于int(或i4),但结果是一个二维数组:
In [366]: np.array([(1,)],dtype=('i4'))
Out[366]: array([[1]])
(早期版本)
我可以通过给fromiter 提供[(1,)] 可迭代来重现您的错误消息。
In [288]: np.fromiter([(1,)],dtype=int)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-288-ba24373a9489> in <module>()
----> 1 np.fromiter([(1,)],dtype=int)
ValueError: setting an array element with a sequence.
fromiter 想要一维输入,例如[1,2,3](或生成器等效项)。
自从我使用 sql 以来已经有一段时间了,但我猜curs.fetchall() 给出了一个元组的可迭代,而不是单个数字的可迭代。
您需要显示(打印)curs.fetchall() 或 list(curs.fetchall()) 以查看传递给 fromiter 的内容。
你为什么使用fromiter?你试过np.array(curs.fetchall())吗?
让我们尝试使用生成器表达式来更好地模拟生成元组的fetchall:
In [298]: np.fromiter((i for i in [(1,2,3)]),dtype=int)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-298-f8fbf106b4d1> in <module>()
----> 1 np.fromiter((i for i in [(1,2,3)]),dtype=int)
ValueError: setting an array element with a sequence.
In [299]: np.array((i for i in [(1,2,3)]),dtype=int)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-299-71dd7463b539> in <module>()
----> 1 np.array((i for i in [(1,2,3)]),dtype=int)
TypeError: int() argument must be a string or a number, not 'generator'
这行得通:
In [300]: np.array(list(i for i in [(1,2,3)]),dtype=int)
Out[300]: array([[1, 2, 3]])
In [301]: list(i for i in [(1,2,3)])
Out[301]: [(1, 2, 3)]
创建 numpy 数组的最简单方法是使用列表 - 它可以是数字列表、列表列表(大小相同)或元组列表。
What's the most efficient way to convert a MySQL result set to a NumPy array? 是之前讨论过使用fetchall 和fromiter。