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

8

这会导致出现错误:

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个回答

7
使每一行成为元组,而不是列表:
import numpy as np
x = np.array([(1, 'O', 1)],
             dtype=np.dtype([('step', 'int32'),
                             ('symbol', '|S1'),
                             ('index', 'int32')]))

Numpy开发者Robert Kern解释

通常,元组被视为“标量”记录,而列表则会被递归处理。这个规则有助于numpy.array()确定哪些序列是记录,哪些是其他需要递归处理的序列;即哪些序列创建另一个维度,哪些是原子元素。


谢谢,但是这样x的形状是(1,)而不是(1,3)吗? - hatmatrix
当定义结构化数组时,这就是你应该得到的。你可以使用类似于 x['symbol'] 的语法访问列。 - unutbu
谢谢,我会将追加字段作为一个单独的问题发布。 - hatmatrix
链接似乎已经失效:http://web.archive.org/web/20130617020606/http://mail.scipy.org/pipermail/numpy-discussion/2011-September/058390.html - Ashwini Chaudhary

2
我将展示一种更通用的创建记录数组的方法:
# 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)  # Python 2

prepare = list(zip(col1, col2, col3))  # Python 3

# assigning value so recarr
recarr[:] = prepare

现在您可以为每个列分配名称:
recarr.dtype.names = ('ID' , 'price', 'text')

然后获取该列的值:

print recarr('price')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接