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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

610閲覧

多次元配列のshapeについて

okahijiki

総合スコア404

NumPy

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/04/14 03:50

編集2021/04/14 06:55

基本的な質問にて失礼します。
numpyにて作った多次元配列の形状は、インスタンス変数のshapeにて確認できます。

python

1import numpy as np 2a=np.array([[1,2,3],[4,5,6]]) 3print(a) 4 5[[1 2 3] 6 [4 5 6]] 7 8print(a.shape) 9(2, 3)

上記の場合、2✕3、2行3列を示していると思うのですが、
下記の場合、1✕3、1行3列なので、(1,3)の方が筋が通っているように思えます。
どこか、解釈が間違っていますでしょうか。よろしくお願いいたします。

python

1b=np.array([1,2,3]) 2print(b.shape) 3(3,)

↓ここから質問後の加筆となります。

python

1c=np.array([[1],[2],[3]]) 2print(c.shape) 3(3, 1) 4 5print(c) 6[[1] 7 [2] 8 [3]] 9 10np.dot(a,b) 11array([14, 32]) 12 13np.dot(a,c) 14array([[14], 15 [32]]) 16

イメージ説明

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

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

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

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

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

guest

回答3

0

np.array([[1,2,3],[4,5,6]])2次元配列ですが、np.array([1,2,3])1次元配列です。
1次元配列は「n×m」のようにして表すことはできません。

python

1np.array([1, 2, 3]).ndim 2# 1 3np.array([1, 2, 3]).shape 4# (3,) 5 6np.array([[1, 2, 3]]).shape 7# 2 8np.array([[1, 2, 3]]).shape 9# (1, 3)

投稿2021/04/14 04:15

kirara0048

総合スコア1399

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

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

okahijiki

2021/04/14 07:08

「1次元配列は「n×m」のようにして表すことはできません。」 参考になります。ありがとうございますー。
guest

0

ベストアンサー

bは1次元の配列です。

以下を見て考えてください。

python

1>>> b = np.array([1,2,3]) 2>>> print(b.shape) 3(3,) 4>>> print(b[1]) 52 6>>> print(b[0,1]) 7Traceback (most recent call last): 8 File "<stdin>", line 1, in <module> 9IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

python

1>>> c = np.array([[1,2,3]]) 2>>> print(c.shape) 3(1, 3) 4>>> print(c[0]) 5[1 2 3] 6>>> print(c[0,1]) 72

python

1>>> d = np.array([[1],[2],[3]]) 2>>> print(d.shape) 3(3, 1) 4>>> print(d[0]) 5[1] 6>>> print(d[1,0]) 72

bとcのshapeがどちらも(1, 3)というのは変だと思いませんか。

投稿2021/04/14 04:11

ppaul

総合スコア24670

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

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

okahijiki

2021/04/14 06:59

ご回答、ありがとうございます。 b = np.array([1,2,3])より、d = np.array([[1],[2],[3]])の方が、 通常の行列の内積とイメージが近く、ピンときます〜。 [質問]に加筆しております。ご参照くださいませ。
okahijiki

2021/04/14 07:04

当初の質問は(1,3)の方が筋が通っているのでは、というものでした。混乱しています。ご容赦くださいませ。
ppaul

2021/04/14 08:51

数学の世界は厳密なように見えて厳密でない部分があります。 数学屋は、全単射があるとか同型写像がある場合にそれらを同一視して考えてしまいます。 ベクトルの内積は、横ベクトルと縦ベクトルの行列積だね、という説明をするとき、実は、自分が縦も横もない一次元ベクトルを、1×nの二次元ベクトルとn×1の二次元ベクトルと同一視していることを忘れてしまっているのです。 プログラマは実装上の問題があるので、ここを厳密に区別します。 このため、(私も含めて)数学系の人間は最初は違和感を持つことが多いのです。
okahijiki

2021/04/15 00:54

ありがとうございます。参考になります!
guest

0

shapeは、各次元の要素数を返すようです。
[[1 2 3]
[4 5 6]]
ならば、最初は[1 2 3]と[4 5 6]の2要素、次が4 5 6の3要素なので、(2,3)

[1 2 3]
ならば、最初は1 2 3の3要素、次がないので、(3,)
ということじゃないでしょうか。

逆に(1,3)をとるような配列は
[[1 2 3]]
ですね。

投稿2021/04/14 04:02

編集2021/04/14 04:05
jeanbiego

総合スコア3966

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

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

okahijiki

2021/04/14 07:07

「1 2 3」ならば、最初は(行としての)[1,2,3]、次に(列としての)[1,2,3]で(1,3)のような気がしなくもないのですが... しかし、[[1 2 3]]にて(1,3)確認できました。ありがとうございます。
jeanbiego

2021/04/14 07:10

>「1 2 3」ならば、最初は(行としての)[1,2,3]、次に(列としての)[1,2,3]で(1,3)のような気がしなくもないのですが... それも一つの考え方ですが、その実装にすると たとえば [[1 2 3] [4 5 6]]は(1,2,3)になってしまいますね。
jeanbiego

2021/04/14 07:12

あと、numpyは下記のようにいくらでも次元を増やせるので、A×B行列という考え方はそぐわないですね。 [ [ [1 2] [3 4] ] [ [5 6] [7 8] ] ] これだと、(2,2,2)ですね。
okahijiki

2021/04/14 07:16

ご指摘、ありがとうございます。どうしてもA✕B行列がアタマから離れなくって。そもそも、それが混乱の原因のような気がしてきました〜
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問