numpyの二次元配列の実装の仕方の違いを教えてください
python
1a1 = np.arange(9).reshape(3, -3) 2a1 = np.arange(9).reshape(3, 3)
この二つの違いを教えていただきたいです。また、これらを書き分ける必要はあるのでしょうか?
よろしくお願いします
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
前者は仕様上は本来認められていない呼び出し方で、reshape(3, -1) と書くべきです。
#####newshape : int or tuple of ints
The new shape should be compatible with the original shape. If an integer, then the result will be a 1-D array of that length.
One shape dimension can be -1. In this case, the value is inferred from the length of the array and remaining dimensions.
引用元: numpy.reshape — NumPy v1.17 Manual 太字は引用者
以降、質問を少し読み替えた上で回答します。
本題
この二つの違いについての質問ですね。
Python
1a1 = np.arange(9).reshape(3, -1) 2a2 = np.arange(9).reshape(3, 3)
結果だけ言えば、どちらも変わりません。
前者は未定の値を決定する余計な処理を介しますが、測定してもほとんど差は出ません。
Python
1import timeit 2import numpy as np 3 4 5def reshape1(arr): 6 arr.reshape(3, -1) 7 8def reshape2(arr): 9 arr.reshape(3, 3) 10 11 12src_arr = np.arange(9) 13print( 14 '(3, -1):', timeit.timeit(lambda: reshape1(src_arr), number=1_000_000) 15) 16print( 17 '(3, 3):', timeit.timeit(lambda: reshape2(src_arr), number=1_000_000) 18)
実行結果 paiza.io
(3, -1): 0.3540483240503818 (3, 3): 0.34941665700171143
分かり易いと思う方を使えば良いのではないでしょうか。
なぜ reshape(3, -3) でも動作するか?
実装で dimensions[i] == -1 ではなく dimensions[i] < 0 が判定に用いられているから。
C
1for (i = 0; i < n; i++) {
if (dimensions[i] < 0) { if (i_unknown == -1) { i_unknown = i; } else { PyErr_SetString(PyExc_ValueError, "can only specify one unknown dimension"); return -1; } } else if (npy_mul_with_overflow_intp(&s_known, s_known, dimensions[i])) { raise_reshape_size_mismatch(newshape, arr); return -1; }
}
if (i_unknown >= 0) {
if (s_known == 0 || s_original % s_known != 0) { raise_reshape_size_mismatch(newshape, arr); return -1; } dimensions[i_unknown] = s_original / s_known;
}
投稿2019/12/07 05:54
編集2019/12/07 06:01総合スコア35668
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/07 08:39