0

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

以上不起作用。

4

1 回答 1

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自身。


直接修改arassign to 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-12T10:02:55.973 回答