Python numpy:如何一次填充结构化数组中的多个字段

Python numpy:如何一次填充结构化数组中的多个字段,python,numpy,structured-array,Python,Numpy,Structured Array,非常简单的问题:我有一个具有多个列的结构化数组,我只想用另一个预先存在的数组填充其中的一些(但不止一个) 这就是我正在尝试的: strc = np.zeros(4, dtype=[('x', int), ('y', int), ('z', int)]) x = np.array([2, 3]) strc[['x', 'y']][0] = x 这给了我未来的警告: main:1:FutureWarning:Numpy检测到您(可能)正在写入数组 通过numpy.diagonal或通过选择记录中的

非常简单的问题:我有一个具有多个列的结构化数组,我只想用另一个预先存在的数组填充其中的一些(但不止一个)

这就是我正在尝试的:

strc = np.zeros(4, dtype=[('x', int), ('y', int), ('z', int)])
x = np.array([2, 3])
strc[['x', 'y']][0] = x
这给了我未来的警告:

main:1:FutureWarning:Numpy检测到您(可能)正在写入数组 通过numpy.diagonal或通过选择记录中的多个字段返回 数组。这段代码可能会在未来的numpy版本中中断-- 有关详细信息,请参见numpy.diagonal或arrays.indexing参考文档。 快速修复方法是制作一个明确的副本(例如,do arr.diagonal().copy()或arr['f0','f1']].copy()


但即使这是一个警告,结构化数组也不会被填充。到目前为止,我对这两个数组都进行了迭代,结果都很有效,但我想这是非常低效的。有更好的方法吗?

如果所有字段都具有相同的数据类型,您可以创建一个视图:

import numpy as np
strc = np.zeros(4, dtype=[('x', int), ('y', int), ('z', int)])
strc_view = strc.view(int).reshape(len(strc), -1)
x = np.array([2, 3])
strc_view[0, [0, 1]] = x
如果您想要一个可以创建任何结构化数组的列视图的通用解决方案,可以尝试:

import numpy as np
strc = np.zeros(3, dtype=[('x', int), ('y', float), ('z', int), ('t', "i8")])

def fields_view(arr, fields):
    dtype2 = np.dtype({name:arr.dtype.fields[name] for name in fields})
    return np.ndarray(arr.shape, dtype2, arr, 0, arr.strides)

v1 = fields_view(strc, ["x", "z"])
v1[0] = 10, 100

v2 = fields_view(strc, ["y", "z"])
v2[1:] = [(3.14, 7)]

v3 = fields_view(strc, ["x", "t"])

v3[1:] = [(1000, 2**16)]

print strc
以下是输出:

[(10, 0.0, 100, 0L) (1000, 3.14, 7, 65536L) (1000, 3.14, 7, 65536L)]

指出尝试索引多个字段会生成一个副本,而不是一个视图。如果您处理的行比字段多,那么在字段上进行迭代没有什么错。谢谢您,HYRY,我认为您的解决方案对于我的小效率问题来说太多了,但它可能对其他人有用