質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

2038閲覧

Numpyのreshape()の使い方に関する質問です。

kazu25

総合スコア27

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/02/13 20:46

python

1import numpy as np 2 3arr = np.arange(9).reshape(3, 3) 4 5vec = arr.reshape(9) 6 7print(vec)

出力結果
[0 1 2 3 4 5 6 7 8]

質問

arrが
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
になることは理解できています。
しかし、
vec = arr.reshape(9)でvecが[0 1 2 3 4 5 6 7 8]になるのが理解できません。
私はreshapeはreshape(3,2)のように行列を変換させるもの
(この場合だと3行2列に変換)だと認識していますが、
reshape(9)をどのように変換させて良いのかわかっていません。

どなたかお教えていただけないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yag1kaz

2018/02/14 03:14 編集

「reshape(9)をどのように変換させて良いのかわかっていません。」という部分が何のために質問しているのかがよくわからないから回答にぶれがでているのかもしれません。どのように?ということの背景を明確にしてはいかがでしょうか?
guest

回答4

0

たしかに不思議ですよね。

numpy.ndarray.reshapeのドキュメンテーション
によると

Notes

Unlike the free function numpy.reshape, this method on ndarray allows the elements of the shape parameter to be passed in as separate arguments. For example, a.reshape(10, 11) is equivalent to a.reshape((10, 11)).

となっていて、
「a.reshape(10, 11) と a.reshape((10, 11))は同じ」(=シンタックスシュガー)
になるそうです。dkato0077さんの回答はこちらに基づいていると思われます。

次に、同じページにはこの関数(ndarray.reshape)自体が以下の関数と同等という記載がありますので、そちらを見てみましょう。

numpy.reshape

numpy.reshapeのドキュメンテーション

そのnewshapeにshapeに関する説明があります。

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.

翻訳すると

新しい形状は、元の形状と互換性がなければなりません。整数の場合、結果はその長さの1次元配列になります。1つの形状寸法は-1とすることができる。この場合、値は配列の長さと残りの次元から推測されます。

「整数の場合、結果はその長さの1次元配列になります。」ということで、この仕様に沿った動作をしていることになります。ちなみにー1でもよいということなので、以下のコードはすべて等価になります。

python

1import numpy as np 2v = np.arange(9).reshape(3,3) 3print(v) 4x = v.reshape(9) 5print(x) # [0 1 2 3 4 5 6 7 8] 6y = v.reshape(-1,) 7print(y) # [0 1 2 3 4 5 6 7 8] 8z = np.ravel(v) 9print(z) # [0 1 2 3 4 5 6 7 8]

投稿2018/02/14 02:23

yag1kaz

総合スコア253

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

reshape(4,3,・・・・)は

左から配列に4つの要素が入る事を指定しています。
そして、次の引数によって、その4つの要素はそれぞれ3つの要素が入る配列であることを指定しているというイメージです。以下それを繰り返すといったものです。

reshape(3,2)は一つ目のリストに3つの要素があり、その3つの要素がそれぞれ2つの要素を持つ配列だよと指示しているので、3行2列と同意になるという考え方ですね。

投稿2018/02/14 03:15

Yuki_S

総合スコア356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

reshape(9)は要素数が9のベクトルに変換しているのであって行列ではありません。1行×9列の行列変換はreshape(1,9)になります。
このふたつは見かけはほとんど同じですが、要素のアクセス方法が違うので意識して使い分けることをお勧めします。

ということで、reshape(9)が[0 1 2 3 4 5 6 7 8]になるのは要素数9のベクトル生成を意味しているため、ということになります。

投稿2018/02/14 02:31

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

are.reshape(9)はare.reshape((9,))のように捉えて見てはどうでしょう。結局一次元のarrayに変換していることになります。

NumPyのreshapeのドキュメントのexampleにもnp.reshape(a, 6)と言う例が上がっていますので、そちらも参考になるかもしれません。
https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

投稿2018/02/13 23:31

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問