如何创建一个numpy记录数组?

时间:2011-10-12 12:13:04

标签: python numpy

这给了我一个错误:

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)。

2 个答案:

答案 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')