使用NumPy结构化数组

时间:2016-12-12 09:59:04

标签: python arrays numpy structured-array

我正在使用具有以下结构的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

以上不起作用。

1 个答案:

答案 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'] == 0resultar['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']。 由于arar['foo']视图,因此修改ar会影响'foo'

请注意索引的顺序。如果您尝试应用布尔掩码 在选择ar[mask]['foo'] = 99 字段之前,如:

ar

然后这会影响ar[mask],因为arar[mask]副本。 对副本(ar)所做的任何操作都不会影响原始文件(2016-12-14T14:00:00-08:00 )。