在python中有一种更好的方法来向结构化的numpy数组添加字段

时间:2018-02-12 05:58:21

标签: arrays python-3.x numpy structured-array

new_dtyp = ny.dtype(finpat.dtype.descr + [('sl','i8'),('diff','i8'),('errtot','i8')])
paterror = ny.array(finpat, dtype=new_dtyp)

我使用的代码虽然有效,但会发出警告信息。鉴于以下......

FutureWarning:具有不同字段名称的结构化数组之间的分配将在numpy 1.14中更改。

以前,dst中的字段将设置为src中具有相同名称的字段的值。在numpy 1.14字段中将被“按位置”分配:dst的第N个字段将被设置为src数组的第N个字段。

有关详细信息,请参阅发行说明

我该怎么做才能注意警告信息。不要沉默它。

2 个答案:

答案 0 :(得分:0)

警告与您设置dtype的方式无关,它只是表示从numpy 1.14开始,对象finpat转换为自定义结构化数组的方式可能与预期。如果finpat中值的字段名称与您定义的new_dtyp中指定的顺序不同,则适用。

您可以在numpy 1.14发行说明(https://docs.scipy.org/doc/numpy/release.html#multiple-field-indexing-assignment-of-structured-arrays)中找到更多信息。

  

具有多个字段的结构化数组的索引和分配   已经在很多方面发生了变化,正如先前版本中所警告的那样。

     

首先,使用多个字段索引结构化数组,例如,   arr[['f1', 'f3']],将视图返回到原始数组而不是   复印件。返回的视图将具有相应的额外填充字节   对于原始数组中的中间字段,与1.13中的副本不同,   这会影响arr[['f1', 'f3']].view(newdtype)等代码。

     

其次,结构化数组之间的分配现在将“通过   位置“而不是”字段名称“。目的地的第N个字段   无论字段名称如何,都将设置为源的第N个字段,   不像numpy版本1.6到1.13中的字段   目标数组设置为相同名称的字段   源数组,如果源没有字段,则为0。

     

相应地,结构化dtypes中的字段顺序现在   计算dtype相等时很重要。例如,使用dtypes

x = dtype({'names': ['A', 'B'], 'formats': ['i4', 'f4'], 'offsets': [0, 4]})
y = dtype({'names': ['B', 'A'], 'formats': ['f4', 'i4'], 'offsets': [4, 0]})
     

表达式x == y现在将返回False,与以前不同。这个   在python<中使基于字典的dtype规范如dtype({'a': ('i4', 0), 'b': ('f4', 4)})危险3.6自dict键顺序   在这些版本中不会保留。

     

从结构化数组到布尔数组的赋值现在提出了一个   ValueError与1.13不同,它始终设置目标   要素True

     

从具有多个字段的结构化数组分配到a   非结构化数组现在引发ValueError。在1.13这复制了   到目的地的第一个源字段。

     

现在不允许在多字段索引中使用字段“titles”,如   正在重复多字段索引中的字段名称。

     

用户指南中的结构化数组文档已经过   显着更新以反映这些变化。

答案 1 :(得分:0)

numpy.lib.recfunctions中的一般策略是按字段名称将数据从原始结构复制到新结构。

举个简单的例子:

In [186]: x = np.array([('one',1),('two',2)], dtype='U3,int')
In [187]: x
Out[187]: array([('one', 1), ('two', 2)], dtype=[('f0', '<U3'), ('f1', '<i4')])
In [188]: y = np.empty(2, dtype=x.dtype.descr+[('three',float)])
In [189]: y
Out[189]: 
array([('', 0, 0.), ('', 0, 0.)],
      dtype=[('f0', '<U3'), ('f1', '<i4'), ('three', '<f8')])
In [190]: for n in x.dtype.names:
     ...:     y[n] = x[n]
     ...:     
In [191]: y
Out[191]: 
array([('one', 1, 0.), ('two', 2, 0.)],
      dtype=[('f0', '<U3'), ('f1', '<i4'), ('three', '<f8')])

在1.14中,我得到了一些错误。

In [192]: z = np.array(x, dtype=y.dtype)
ValueError: structures must have the same size

我不记得曾在早期版本中试过这个。