如何写入结构化数组的多个字段



>我有一个带有名称字段的nd数组,如下所示。 我正在尝试一次为多个字段分配值,但似乎根本没有效果。 请参阅以下示例:

In [380]: A = numpy.zeros(dtype=[("A", "f8"), ("B", "f8"), ("C", "f8")], shape=(5,))                                                                                                                 
In [381]: A[["A", "B", "C"]][0] = (2, 3, 4)

我希望现在将这些值分配给A,但实际上,数组仍然是全零:

In [382]: A[0]
Out[382]: (0.0, 0.0, 0.0)

当我反向索引时,我得到一个IndexError;(A[0]["A"]有效,但A[0][["A", "B", "C"]] IndexError

In [383]: A[0][["A", "B", "C"]] = (2, 3, 4)
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-383-9b5cca19867a> in <module>()
----> 1 A[0][["A", "B", "C"]] = (2, 3, 4)
IndexError: invalid index

为什么A[fieldnames][0] = values不分配任何东西? 为什么A[0][fieldnames]会因IndexError而失败? 如何一次将多个值写入结构化数组(除了显式循环)?

如果您确实要设置所有三个字段,如示例中所示,您只需选择第一个条目:

A[0] = 2, 3, 4

在另一种情况下(如A[['A','B']][0] = 2, 3),这可能有助于您理解一点:

FutureWarning: Numpy has detected that you (may be) writing to an array returned
by numpy.diagonal or by selecting multiple fields in a record
array. This code will likely break in a future numpy release --
see numpy.diagonal or arrays.indexing reference docs for details.
The quick fix is to make an explicit copy (e.g., do
arr.diagonal().copy() or arr[['f0','f1']].copy()).

在 numpy 的未来版本中,这可能会变得更容易,因为使用多个字段进行索引将很快返回一个视图:

记录访问

如果 ndarray 对象是记录数组,即其数据类型为 记录数据类型,数组的字段可以通过索引访问 带有字符串的数组,类似于字典。

索引x['field-name']返回数组的新视图,该视图是 与 x 形状相同(字段是子数组时除外),但数据 键入 x.dtype['field-name'] 并仅包含 指定的字段。记录数组标量也可以"索引"这个 道路。

索引

到记录数组也可以使用字段列表来完成 名称,例如 x[['field-name1','field-name2']] .目前,这将返回一个 新数组,其中包含 中指定的字段中值的副本 列表。从 NumPy 1.7 开始,返回副本在 赞成返回视图。将继续返回副本 现在,但是在写入副本时将发出FutureWarning。如果 您依赖于当前行为,那么我们建议您复制 显式返回数组,即使用 x[[‘field-name1’,’field-name2’]].copy() .这将适用于两个过去 以及 NumPy 的未来版本。

  • A[fieldnames][0] = values不分配任何内容,因为您要将值分配给数组的副本,由 A[fieldnames] 返回。

  • A[0][["A", "B", "C"]]失败,因为正如消息所述["A", "B", "C"]是一个无效的索引。您想使用A[0]=2,3,4 .

相关内容

  • 没有找到相关文章

最新更新