0
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 个字段。

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

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

4

2 回答 2

1

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

您可以在 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如果源没有字段。

相应地,在计算 dtype 相等性时,结构化 dtypes 中的字段顺序现在很重要。例如,使用 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。这使得基于字典的 dtype 规范dtype({'a': ('i4', 0), 'b': ('f4', 4)})在 python < 3.6 中很危险,因为在这些版本中没有保留 dict 键顺序。

从结构化数组到布尔数组的赋值现在会引发 ValueError,这与 1.13 中不同,在 1.13 中它总是将目标元素设置为True.

从具有多个字段的结构化数组分配给非结构化数组现在会引发 ValueError。在 1.13 中,这仅将源的第一个字段复制到目标。

现在不允许在多字段索引中使用字段“标题”,在多字段索引中重复字段名称也是如此。

用户指南中的结构化数组文档已进行了重大更新,以反映这些更改。

于 2018-02-12T06:41:52.957 回答
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

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

于 2018-02-12T07:25:42.207 回答