非常简单的问题:我有一个包含多个列的结构化数组,我只想用其他预先存在的数组填充其中一些(但不止一个)。
这就是我正在尝试的:
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参考文档。 快速解决方案是制作一个明确的副本(例如,做 arr.diagonal()。copy()或arr [['f0','f1']]。copy())。
但即使这是一个警告,结构化数组也不会被填满。到目前为止,我正在迭代两个数组并且它可以工作,但我猜这是非常低效的。还有更好的方法吗?
答案 0 :(得分:11)
如果所有字段都具有相同的dtype,则可以创建视图:
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)]