2014-02-16 40 views
6

非常简单的问题:我有一个具有多个列的结构化数组,我只想用另一个预先存在的数组填充其中的一部分(但不止一个)。numpy:如何一次填充结构化数组中的多个字段

这就是我想:

strc = np.zeros(4, dtype=[('x', int), ('y', int), ('z', int)]) 
x = np.array([2, 3]) 
strc[['x', 'y']][0] = x 

这给了我这个未来的警告:

主要:1:FutureWarning:numpy的检测到您(可能)写通过numpy.diagonal或通过在记录 阵列中选择多个字段返回的数组 。此代码会在将来的版本numpy的突破可能性 - 详见numpy.diagonal或arrays.indexing参考文档。 快速修复是制作一个明确的副本(例如,做 arr.diagonal()。copy()或arr [['f0','f1']]。copy())。

但即使这是一个警告,结构化数组不会被填充。到目前为止,我遍历两个数组超过和它的作品,但我想这是非常低效的。有没有更好的办法?

+0

http://stackoverflow.com/questions/3058602/python-numpy-structured-array-recarray-assigning - 值 - 到 - 切片指出,试图索引几个领域会产生一个副本,而不是一个视图。如果您正在使用比场更行的工作,有什么不对迭代领域。 – hpaulj

回答

11

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

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)] 
+0

谢谢HYRY,我认为您的解决方案是太多了我的小unefficiency uneasyness但你从哪里学这个黑暗魔法也可以为别人 – Federico

+0

是有用的......? –