这给了我一个错误:
import numpy as np
x = np.array([[1, 'O', 1]],
dtype=np.dtype([('step', 'int32'),
('symbol', '|S1'),
('index', 'int32')]))
TypeError: expected a readable buffer object
我不知道为什么会失败?
或者,我怎么能强迫这样的陈述起作用?
x = np.array([[1, 'O', 1]])
然后
x.dtype = np.dtype([('step', 'int32'),('symbol', '|S1'),('index', 'int32')])
或
x.view(dtype=np.dtype([('step', 'int32'),('symbol', '|S1'),('index', 'int32')]))
都给我
ValueError: new type not compatible with array.
修改
如果我尝试将每个记录作为元组输入,它会认为三元组是单个值,而不是三个单独的字段?例如:
import numpy as np
x = np.array([(1, 'O', 1)],
dtype=np.dtype([('step', 'int32'),
('symbol', '|S1'),
('index', 'int32')]))
看起来很好,直到我这样做:
import numpy.lib.recfunctions as rec
rec.append_fields(x,'x',x['index']+1)
给了我
TypeError: object of type 'numpy.int32' has no len()
大概是因为x.shape
是(1,)而不是(1,3)。
答案 0 :(得分:7)
将每一行设为元组,而不是列表:
import numpy as np
x = np.array([(1, 'O', 1)],
dtype=np.dtype([('step', 'int32'),
('symbol', '|S1'),
('index', 'int32')]))
Numpy开发者Robert Kern explains:
通常,元组被视为“标量”记录,列表是 递归。这个规则有助于numpy.array()找出哪个 序列是记录,是要递归的其他序列 根据;即哪些序列创建另一个维度,哪个序列是 原子元素。
答案 1 :(得分:1)
我将展示一种更通用的创建记录数组的方法:
# prepare the array with different types
recarr = np.zeros((4,), dtype=('i4,f4,a10'))
# creating the columns
col1 = [1, 7, 2, 3]
col2 = [1.1, 0.5, 2, 7.45]
col3 = ['This', 'is', 'text', '!!!']
# create a list of tuples from columns
prepare = zip(col1, col2, col3)
# assigning value so recarr
recarr[:] = prepare
现在您可以为每个列指定名称:
recarr.dtype.names = ('ID' , 'price', 'text')
以后获取此列的值:
print recarr('price')