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']arar['foo']ar


ここでは、インデックスの順序が重要であることに注意してください。'foo'次のように、フィールドを選択する前にブール値マスクを適用しようとした場合:

ar[mask]['foo'] = 99

は のコピーであるため、これは影響しません。コピー ( ) に対して何も行われても、元の ( ) には影響しません。arar[mask]arar[mask]ar

于 2016-12-12T10:02:55.973 に答える