我正在使用具有以下结构的NumPy结构化数组:
ar = np.array([(760., 0), (760.3, 0), (760.5, 0), (280.0, 1), (320.0, 1), (290.0, 1)], dtype=[('foo', 'f4'),('bar', 'i4')])
为“bar”的特定值提取“foo”字段的有效方法是什么?例如,我想在数组中存储'bar'为0的所有'foo'值:
fooAr = ar['foo'] if ar['bar'] is 0
以上不起作用。
答案 0 :(得分:2)
使用ar['foo'][ar['bar'] == 0]
:
ar = np.array([(760., 0), (760.3, 0), (760.5, 0), (280.0, 1), (320.0, 1), (290.0, 1)], dtype=[('foo', 'f4'),('bar', 'i4')])
print(ar['bar'] == 0)
# array([ True, True, True, False, False, False], dtype=bool)
result = ar['foo'][ar['bar'] == 0]
print(result)
# array([ 760. , 760.29998779, 760.5 ], dtype=float32)
请注意,由于使用了布尔选择掩码ar['bar'] == 0
,result
是ar['foo']
部分的副本。
因此,修改result
不会影响ar
本身。
直接修改ar
分配给ar['foo'][mask]
:
mask = (ar['bar'] == 0)
ar['foo'][mask] = 100
print(ar)
# array([(100.0, 0), (100.0, 0), (100.0, 0), (280.0, 1), (320.0, 1), (290.0, 1)],
# dtype=[('foo', '<f4'), ('bar', '<i4')])
分配给ar['foo'][mask]
来电ar['foo'].__setitem__
ar['foo']
影响ar['foo']
。
由于ar
是ar['foo']
的视图,因此修改ar
会影响'foo'
。
请注意索引的顺序。如果您尝试应用布尔掩码
在选择ar[mask]['foo'] = 99
字段之前,如:
ar
然后这会不影响ar[mask]
,因为ar
是ar[mask]
的副本。
对副本(ar
)所做的任何操作都不会影响原始文件(2016-12-14T14:00:00-08:00
)。