使用NumPy结构化阵列

2024-10-01 19:33:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

上述方法不起作用。你知道吗


Tags: 方法numpyiffoonpbar数组结构
1条回答
网友
1楼 · 发布于 2024-10-01 19:33:40

使用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]ar的拷贝。 对副本(ar[mask])所做的任何操作都不会影响原件(ar)。你知道吗

相关问题 更多 >

    热门问题