通过使用字段名列表进行索引,我可以在numpy
结构化数组中一次看到多个列(fields
),例如
import numpy as np
a = np.array([(1.5, 2.5, (1.0,2.0)), (3.,4.,(4.,5.)), (1.,3.,(2.,6.))],
dtype=[('x',float), ('y',float), ('value',float,(2,2))])
print a[['x','y']]
#[(1.5, 2.5) (3.0, 4.0) (1.0, 3.0)]
print a[['x','y']].dtype
#[('x', '<f4') ('y', '<f4')])
但问题是,它似乎是一个副本,而不是一个视图:
b = a[['x','y']]
b[0] = (9.,9.)
print b
#[(9.0, 9.0) (3.0, 4.0) (1.0, 3.0)]
print a[['x','y']]
#[(1.5, 2.5) (3.0, 4.0) (1.0, 3.0)]
如果我只选择了一列,它就是一个视图:
c = x['y']
c[0] = 99.
print c
#[ 99. 4. 3. ]
print a['y']
#[ 99. 4. 3. ]
有没有办法可以一次获得多个列的视图行为?
我有两种变通方法,一种是循环遍历列,另一种是创建一个分层的dtype
,这样一列实际上会返回一个结构化数组,其中包含我想要的两个(或更多)字段。不幸的是,zip
也会返回一个副本,所以我不能这样做:
x = a['x']; y = a['y']
z = zip(x,y)
z[0] = (9.,9.)
发布于 2014-02-17 01:36:27
您可以创建一个只包含所需字段的dtype对象,并使用numpy.ndarray()
创建原始数组的视图:
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)]
发布于 2016-08-26 04:32:06
基于@HYRY的答案,你也可以使用ndarray
的方法getfield
def fields_view(array, fields):
return array.getfield(numpy.dtype(
{name: array.dtype.fields[name] for name in fields}
))
发布于 2017-03-20 09:35:26
从Numpy版本1.13开始,您提出的代码将返回一个视图。请参阅本页上的'NumPy 1.12.0发行说明->未来的变化->结构化数组的多字段操作‘:
https://stackoverflow.com/questions/15182381
复制相似问题