1

以下にnumpy配列(2要素リストのリスト)があり、探したいa2要素のリストがあります。[30.94, 0.]

次のことを行ったとき、望ましい結果が得られません。なんで?

import numpy as np
a = np.array([[  5.73,   0.  ],
              [ 57.73,  10.  ],
              [ 57.73,  20.  ],
              [ 30.94,   0.  ],
              [ 30.94,  10.  ],
              [ 30.94,  20.  ],
              [  4.14,   0.  ],
              [  4.14,  10.  ]])

np.where(a==np.array([30.94, 0.]))

しかし、私は得る

(array([0, 3, 3, 4, 5, 6]), array([1, 0, 1, 0, 0, 1]))

これは真実ではありません。

4

2 に答える 2

4

Divakar が示唆したように、a == np.array([30.94, 0.])それはあなたが期待するものではありません。配列はブロードキャストされ、比較は要素ごとに行われます。結果は次のとおりです。

array([[False,  True],
       [False, False],
       [False, False],
       [ True,  True],
       [ True, False],
       [ True, False],
       [False,  True],
       [False, False]], dtype=bool)

ただし、次の方法で必要なものを取得できますnp.all

>>> np.all(a==np.array([30.94, 0.]), axis=-1)
array([False, False, False,  True, False, False, False, False], dtype=bool)
>>> np.where(_)
(array([3]),)

したがって、予想どおり、行 3 が一致することがわかります。==浮動小数点数を使用する場合の通常の警告がここに適用されることに注意してください。

于 2016-12-22T20:14:37.790 に答える
1

さらに別の解決策ですが、特に大きな配列の場合、これはディートリッヒの解決策よりも少し遅くなることに注意してください。

In [1]: cond = np.array([30.94, 0.])
In [2]: arr = np.array([[  5.73,   0.  ],
                       [ 57.73,  10.  ],
                       [ 57.73,  20.  ],
                       [ 30.94,   0.  ],
                       [ 30.94,  10.  ],
                       [ 30.94,  20.  ],
                       [  4.14,   0.  ],
                       [  4.14,  10.  ]])

In [3]: [idx for idx, el in enumerate(arr) if np.array_equal(el, cond)]
Out[3]: [3]
于 2016-12-23T00:14:47.967 に答える