使用 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
,因此 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]
是[=18=的副本 ].
对副本 (ar[mask]
) 所做的任何操作都不会影响原始 (ar
)。
我正在使用具有以下结构的 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
,因此 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]
是[=18=的副本 ].
对副本 (ar[mask]
) 所做的任何操作都不会影响原始 (ar
)。