Python 将字段附加到大小为1的结构化数组时出现TypeError

Python 将字段附加到大小为1的结构化数组时出现TypeError,python,numpy,structured-array,Python,Numpy,Structured Array,在尝试将字段附加到大小为1的结构化数组时,我遇到了一个运行时错误。我在下面写了一个简单的例子: import numpy as np import numpy.lib.recfunctions as rcfuncs dtype_ = np.dtype( { 'names': ["field_a","field_b","field_c"] , 'formats': ['S32', 'i4', 'f8']} ) data_ =

在尝试将字段附加到大小为1的结构化数组时,我遇到了一个运行时错误。我在下面写了一个简单的例子:

import numpy as np
import numpy.lib.recfunctions as rcfuncs

dtype_ = np.dtype( { 'names': ["field_a","field_b","field_c"]
                  , 'formats': ['S32', 'i4', 'f8']}
                  )
data_ = [("1",17, 123.45)]
numpy_array = np.array(data_, dtype_)            

# append 2 fields
numpy_array = rcfuncs.append_fields( numpy_array,["field_d","field_e"],data=[ "1","3" ] )

# append 1 field fails :(
numpy_array = rcfuncs.append_fields( numpy_array, "field_f", data=["123456"] )
我得到了一个错误:

TypeError: descriptor 'ravel' requires a 'numpy.ndarray' object but received a 'numpy.void'
同样,如果我“反转”了appends,则带有两个append字段的语句将失败:

# append 1 field
numpy_array = rcfuncs.append_fields( numpy_array, "field_f", data=["123456"] )

# append 2 fields fails :(
numpy_array = rcfuncs.append_fields( numpy_array,["field_d","field_e"],data=[ "1", "3" ] )
我使用的是python 2.7.11和numpy 1.11.0,当初始数组的大小大于2时,我没有问题

如何解决类型错误


谢谢

在将可选参数usemask设置为False时,我们没有收到TypeError

numpy_array = \
  rcfuncs.append_fields(numpy_array, "field_f", data=["123456"], usemask=False)
numpy_array = \
  rcfuncs.append_fields(numpy_array,["field_d","field_e"],data=[ "1", "3" ], usemask=False)

作为参考,这里是完整的回溯

从一个结构化数组开始,其中有一条记录:

array([('1', 17, 123.45)], 
      dtype=[('field_a', 'S32'), ('field_b', '<i4'), ('field_c', '<f8')])

因此,一个解决办法是关闭
屏蔽数组的使用。除非添加的字段缺少一些数据,否则不需要这样做

另一种方法是将第一个参数放入列表中:

rcfuncs.append_fields( [numpy_array1], "field_f", data=['12345'])
append_字段(基本,…)
调用

merge_arrays(base, usemask=usemask, fill_value=fill_value)
这反过来又叫

base.ravel()  # now call seq_arrays
但首先它检查它的长度是1

# Only one item in the input sequence ?
if (len(seqarrays) == 1):
    seqarrays = np.asanyarray(seqarrays[0])
对于简单的结构化数组,
y
,以及它的屏蔽等价物,
ym

In [405]: y
Out[405]: 
array([(b'xxx', 1)], 
      dtype=[('f0', 'S5'), ('f1', '<i4')])
In [406]: ym=np.ma.masked_array(y)
np.asanyarray(ym[0]).ravel()生成此类型错误

如果基是一个列表,
[ym]
,则只提取
ym
。如果基数为(2,)或更长,则不会传递此语句

我还没有想到修复这个问题——在列表中传递屏蔽数组的用户级混乱


一种可能的修复方法是简单地删除此
base=merge_数组(base…
行(在
append_字段中)
)。但我首先需要知道它为什么会在那里。其目的可能是清理某些
base
数组输入

单元测试文件
test/test\u recfunctions.py
在注释掉这一行后运行良好

我已经在一个旧的
numpy
问题上添加了对此的评论


我刚刚发现了这一点。默认设置是生成一个屏蔽数组,但显然在对屏蔽数组进行进一步追加时存在错误。这就是为什么第一次追加总是有效的,但是第二次追加失败了。除非你需要掩蔽,否则你可以离开它,否则,考虑提交bug报告。或者我们可以深入研究
append\u字段
code。我将填写一份错误报告。我找到了另一个修复方法,将第一个参数放入列表:
rcfuncs.append\u字段([numpy\u数组],“field\u f”,data=['12345'])
。我会解释为什么这在我的生活中起作用answer@hpaulj:似乎是检查原始阵列大小是否为1的解决方案效果更好。我遇到过几个使用可选参数usemask是不够的情况。谢谢。这是一个很少使用的
numpy
code区域-请注意,您必须单独导入
rcfuncs
# Only one item in the input sequence ?
if (len(seqarrays) == 1):
    seqarrays = np.asanyarray(seqarrays[0])
In [405]: y
Out[405]: 
array([(b'xxx', 1)], 
      dtype=[('f0', 'S5'), ('f1', '<i4')])
In [406]: ym=np.ma.masked_array(y)
In [407]: np.asanyarray(y[0])
Out[407]: 
array((b'xxx', 1), 
      dtype=[('f0', 'S5'), ('f1', '<i4')])
In [408]: np.asanyarray(ym[0])
Out[408]: (b'xxx', 1)
In [409]: type(np.asanyarray(ym[0]))
Out[409]: numpy.ma.core.mvoid