我尝试运行以下python代码。
import numpy as np
recarr = np.zeros((2,), dtype=('i4,f4,a10'))
col1 = np.arange(1,3)
col2 = np.arange(4,6, dtype=np.float32)
col3 = ['Man', 'Woman']
tmp = zip(col1, col2, col3)
recarr[:] = tmp
但是我收到以下错误消息。
File "<ipython-input-55-0c1735078108>", line 1, in <module>
recarr[:] = tmp
ValueError: setting an array element with a sequence.
你能帮我解决这个问题吗?谢谢。
答案 0 :(得分:2)
zip
函数返回一个迭代器。要将其正确分配给切片,必须实现迭代器:
>>> recarr[:] = list(tmp)
>>> recarr
array([(1, 4., b'Man'), (2, 5., b'Woman')],
dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', 'S10')])
注意,如果您不想将迭代器实现为浪费的中间数据结构,则可以使用np.fromiter
:
>>> recarr = np.fromiter(tmp, dtype=('i4,f4,a10'), count=2)
>>> recarr
array([(1, 4., b'Man'), (2, 5., b'Woman')],
dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', 'S10')])
>>>
注意,我传递了count
参数,这是可选的,但是如果你可以提供count
参数,它将使这个构造函数更有效率。