回答編集履歴

1

変更

2021/08/27 03:00

投稿

kirara0048
kirara0048

スコア1399

test CHANGED
@@ -1,14 +1,46 @@
1
+ [np.argsort()関数](https://numpy.org/devdocs/reference/generated/numpy.argsort.html#numpy-argsort)(あるいはndarrayの`.argsort()`メソッド)を用いると、配列の小さい順のインデックスを得ることができます。
2
+
3
+
4
+
1
5
  ```python
2
6
 
3
- def get_min_index(arr, n):
7
+ arr = np.array([2, 6, 4, 1, 5, 3])
4
8
 
9
+ idx = np.argsort(arr)
10
+
11
+
12
+
13
+ print(idx) # [3 0 5 2 4 1]
14
+
5
- return np.unravel_index(arr.ravel().argsort()[:n], arr.shape)
15
+ print(arr[idx]) # [1 2 3 4 5 6]
6
16
 
7
17
  ```
8
18
 
9
19
 
10
20
 
11
- なお、順番を気しなくて良いなら、上記の`.argsort()`を`.argpartition(n)`に変更するで速くます。
21
+ なお引数に`axis=None`を指定すると多次元配列を一次元配列とみして処理します。
22
+
23
+
24
+
25
+ 以下は`.argsort()`メソッドで小さい順にn番目までのインデックスを取得し、一次元インデックスを[np.unravel_index()関数](https://numpy.org/devdocs/reference/generated/numpy.unravel_index.html#numpy-unravel-index)を用いて二次元座標にする自作関数の例です(渡す配列が三次元以上でも機能します)。
26
+
27
+
28
+
29
+ ```python
30
+
31
+ def get_min_index(arr, n):
32
+
33
+ return np.unravel_index(np.argsort(arr, axis=None)[:n], arr.shape)
34
+
35
+ ```
36
+
37
+
38
+
39
+ なお、結果が小さい順に並んでいなくても良いなら、上記の`np.argsort(arr, axis=None)`を`np.argpartition(arr, n, axis=None)`に変更することで速くなります。(`argpartition()`は、やっていることは`argsort()`より単純なのですが言葉で説明すると複雑なので説明は割愛します……)
40
+
41
+
42
+
43
+ ---
12
44
 
13
45
 
14
46