我有一个带有名字字段的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
而失败?如何一次将多个值写入结构化数组(除了显式循环)?
答案 0 :(得分:1)
如果您确实要设置所有三个字段,就像您在示例中所示,您只需选择第一个条目:
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对象是记录数组,即其数据类型是a 记录数据类型,可以通过索引访问数组的字段 带字符串的数组,类似字典。
索引
x['field-name']
会向数组返回一个新的view 与 x 相同的形状(当字段是子数组时除外)但是数据 键入x.dtype['field-name']
并仅包含部分数据 指定的字段。记录数组标量也可以“索引” 方式。也可以使用字段列表将索引编入记录数组 名称,例如
x[['field-name1','field-name2']]
。目前这返回一个 包含指定字段中值的副本的新数组 列表。从NumPy 1.7开始,返回副本已被弃用 赞成回归观点。将继续返回副本 现在,但在写入副本时将发出FutureWarning
。如果 你依赖于当前的行为,然后我们建议复制 显式返回数组,即使用x[[‘field-name1’,’field-name2’]].copy()
。这将适用于过去 NumPy的未来版本。
答案 1 :(得分:0)
A[fieldnames][0] = values
不会分配任何内容,因为您要将值分配给A[fieldnames]
返回的数组副本。
A[0][["A", "B", "C"]]
失败,因为消息显示["A", "B", "C"]
是无效索引。您想使用A[0]=2,3,4
。