teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

d

2019/12/20 16:12

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  > data[::-1]をしてから、sortされるので、
2
2
 
3
- `data[::-1]` してから sort されるという認識は正しいですが、ソート前の結果がどのような並び順であろうとも、ソート後の結果は同じになります。
3
+ `data[::-1]` してから sort されるという認識は正しいですが、ソート前の配列がどのような並び順であろうとも、ソート後の結果は同じになります。
4
4
  numpy の sort は昇順ソート (小さい順) される仕様です。
5
5
 
6
6
  今回、混乱の原因となっているのは、numpy の view と ndarray.sort() が inplace でソートする仕様というのが関係しています。
@@ -8,11 +8,20 @@
8
8
  とりあえず、意図通りにソートしたい場合は、ndarray.sort() でなく、numpy.sort() をお使いください。
9
9
 
10
10
  ```python
11
+
11
12
  import numpy as np
12
13
 
13
14
  a = np.array([9, 2, 3, 4, 10, 6, 7, 8, 1, 5])
15
+
16
+ # 小さい順
14
17
  b = np.sort(a)
15
18
  print(b) # [ 1 2 3 4 5 6 7 8 9 10]
19
+
20
+ # 大きい順にソートしたい場合はあとから反転
21
+ print(b[::-1]) # [10 9 8 7 6 5 4 3 2 1]
22
+
23
+ # もしくは1次元配列なら組み込み関数 sorted()
24
+ print(sorted(b, reverse=True)) # [10 9 8 7 6 5 4 3 2 1]
16
25
  ```
17
26
 
18
27
  ## 今回の原因
@@ -27,10 +36,10 @@
27
36
  ```
28
37
 
29
38
  今回のストライドを確認すると、4 bytes となっています。(int32型は1つの要素が4バイトで表される)
30
- なので、a の2個目の要素にアクセスしたい場合は、内部の1次元配列の先頭から 2*4=8 bytes 目を参照すればよいということがわかります。
39
+ なので、a のインデックスが2の要素にアクセスしたい場合は、内部の1次元配列の先頭から 2*4=8 bytes 目を参照すればよいということがわかります。
31
40
 
32
41
  今、`b = a[::-1]` とした場合、これは `a` を逆順にした別の配列 `b` というのが作られるわけではなく、ストライドで内部の1次元配列のアクセスの仕方を変更するだけで、実態は `a` と同じものになります。
33
- ストライドは -4 bytes となっていて、b の2個目の要素にアクセスしたい場合は、内部の1次元配列の 末尾から -2*4=-8 bytes 目を参照すればよいということがわかります。
42
+ ストライドは -4 bytes となっていて、b のインデックスが2の要素にアクセスしたい場合は、内部の1次元配列の 末尾から -2*4=-8 bytes 目を参照すればよいということがわかります。
34
43
 
35
44
  ```
36
45
  b = a[::-1]