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

时间:2014-04-04 14:43:10

标签: arrays numpy multidimensional-array

我有一个带有名字字段的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而失败?如何一次将多个值写入结构化数组(除了显式循环)?

2 个答案:

答案 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版本中,这可能会变得更容易,因为使用多个字段进行索引很快就会返回一个视图:

  

Record Access

     

如果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