>我有一个带有名称字段的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
.