使用 NumPy 结构化数组

Working with NumPy structured arrays

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

上面的不行。

使用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,因此 resultar['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]是[=18=的副本 ]. 对副本 (ar[mask]) 所做的任何操作都不会影响原始 (ar)。