概ね同じと考えて差し支えありませんが、若干異なります。
reshape(-1)で最初のaxis(0)にすべて並べることになるので、とりあえずshapeは一致します。
あとは並び替えの順序が同じかどうか? ですが、これはドキュメントを見るとわかります。
numpy.reshape — NumPy v1.15 Manual
numpy.ndarray.flatten — NumPy v1.15 Manual
どちらも並び替えの順序をorder
という引数で指定するようになっており、デフォルト値はともに"C"
で、これは「row-major (C-style) order」を意味するようです。具体的にどんなものかはともかくとして、同じ並び替えをするということが重要です。
要するに同じような結果を返すのですが、じゃあ何が違うのか? というと、flatten()は「A copy of the input array, flattened to one dimension.」を、reshape(-1)は「This will be a new view object if possible; otherwise, it will be a copy.」を返します。
flatten()は確実にcopyが返りますが、reshape(-1)は極力viewを返し、viewが返せないときだけcopyを返すという仕様、ということですね。
それはわかったけど、copyとかviewってなんだよ? という疑問を抱いているかもしれません。numpyのcopyとviewについてご存知なければ、以下の参考リンクを読んでください。
参考:
NumPyのコピー(copy)とビュー(view)を分かりやすく解説 - DeepAge
現象的には、次のようなことが起こり得ます。
python
1>>> import numpy as np
2>>> a = np.arange(8).reshape(2,2,2)
3>>> a
4array([[[0, 1],
5 [2, 3]],
6
7 [[4, 5],
8 [6, 7]]])
9>>> a_f = a.flatten()
10>>> a_f
11array([0, 1, 2, 3, 4, 5, 6, 7])
12>>> a_f[0] = 100
13>>> a_f
14array([100, 1, 2, 3, 4, 5, 6, 7])
15>>> a # a_fは「copy」なので、元のaには影響しない
16array([[[0, 1],
17 [2, 3]],
18
19 [[4, 5],
20 [6, 7]]])
21>>> a_r = a.reshape(-1)
22>>> a_r
23array([0, 1, 2, 3, 4, 5, 6, 7])
24>>> a_r[0] = 200
25>>> a_r
26array([200, 1, 2, 3, 4, 5, 6, 7])
27>>> a # a_rはviewだったので、a_rを変更すると元のaも変わってしまう
28array([[[200, 1],
29 [ 2, 3]],
30
31 [[ 4, 5],
32 [ 6, 7]]])
今後いろいろ質問したいと思うので、「次質問するときはこうしたらいいよ!」というのがあれば一緒にお願いします。
すでに目を通しているかもしれませんが、
3分でわかるteratail|teratail(テラテイル)
質問するときのヒント|teratail(テラテイル)
推奨していない質問|teratail(テラテイル)
あたりは見ておいてください。
また、初心者の方の場合、疑問はできるだけ自力で解消した方が成長に繋がる気がします。安直な質問は質問する人も回答する人も不幸にします。
google検索で調べたり、関連するリファレンス・マニュアルを読んだり、あれこれコードを動かしてみたり……といった問題解決をするための努力は惜しまないほうが良いです。
それで駄目だったときに質問しましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/30 03:57