回答編集履歴
1
変更
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
|
-
|
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
|
-
|
15
|
+
print(arr[idx]) # [1 2 3 4 5 6]
|
6
16
|
|
7
17
|
```
|
8
18
|
|
9
19
|
|
10
20
|
|
11
|
-
なお
|
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
|
|