8

質問を明確にするために、配列 a が Out[123]: [1, 3, 4, 6, 9, 10, 54] の場合、リスト内の数値を検索しようとすると、searchsort は正しい値を返しますが、リストにないものを試してみると、ばかげた値が返されます

これが結果の一部です

In [131]: a
Out[131]: [1, 3, 4, 6, 9, 10, 54]

In [132]: searchsorted(a,1)
Out[132]: 0

In [133]: searchsorted(a,6)
Out[133]: 3

In [134]: searchsorted(a,[9,54,1])
Out[134]: array([4, 6, 0])

In [135]: searchsorted(a,[9,54,1,0])
Out[135]: array([4, 6, 0, 0])
***> # here 0 is not in the list, but turns up @ position 0***

In [136]: searchsorted(a,740)
Out[136]: 7
***> # here 0 is not in the list, but turns up @ position 7***

なぜこうなった?

4

4 に答える 4

12

searchsorted要素が保証順序に属する場所を示します。

vの対応する要素がインデックスの前に挿入された場合に、aの順序が保持されるように、ソートされた配列aにインデックスを見つけます。

位置7に挿入する740と、位置0に0を挿入するのと同様に、順序が保持されます。

于 2013-03-15T06:20:54.487 に答える
3

searchsorted物事どこにあるかを教えてくれるのではなく、リストをソートしておくために物事がどこに行くべきかを教えてくれます。

したがって0、の前の位置0に挿入する必要があり1ます。同様に740、リストの現在の終わりを超えて、位置7に挿入する必要があります。

こちらのドキュメントを読むと、これを確認できます。

numpy.searchsorted(a、v、side ='left'、sorter = None)

順序を維持するために要素を挿入する必要があるインデックスを見つけます。

vの対応する要素がインデックスの前に挿入された場合に、aの順序が保持されるように、ソートされた配列aにインデックスを見つけます。

于 2013-03-15T06:21:24.317 に答える
1

ドキュメントから、ソートされたリスト内のアイテムの挿入ポイントを見つけるために二分探索を使用すると述べています。

「挿入ポイント」という単語は、並べ替えられた配列Aの挿入ポイントインデックスNにアイテムIが挿入された場合、配列Aは新しいアイテムIで並べ替えられたままになることを意味します。

配列がソートされていないため、のような例[9, 54, 1]は無意味です。

Pythonのモジュールを使用bisectして、numpyなしで同じことを行うことができます。

于 2013-03-15T06:20:41.330 に答える