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

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

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

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

Python 3.x

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

Q&A

解決済

2回答

246閲覧

Numpyを使った行列計算について

IOError

総合スコア25

NumPy

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

Python 3.x

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

0グッド

0クリップ

投稿2018/05/20 08:32

Python3初心者です。
今、Numpyを用いて行列の計算を行なっています。
コードはエラーなく実行できるのですが、Numpyの配列の使い方で躓いてしまいました。
やりたいことは以下です。

3次正方行列a1を a1 = ((0.3, 0.3, 0.4), (0.1, 0.5, 0.4), (0.2, 0.6, 0.2))
1行3列のベクトルa2を a2 = (0.6, 0.25, 0.15)
とします。(行列を"()"で表現していますが、pythonのタプルではありません)
a1, a2に対して、
tmp = a2・a1 = (0.235, 0.395, 0.37)
という行列の掛け算を行います。
この掛け算の結果をベクトルa2に追加して、2行3列の行列を作りたいです。

上記のアルゴリズムをコードにしたのが以下です。

python

1import numpy as np 2 3a1 = np.array([[0.3, 0.3, 0.4], [0.1, 0.5, 0.4], [0.2, 0.6, 0.2]]) 4a2 = np.array([0.6, 0.25, 0.15]) 5tmp = np.array([0, 0, 0]) # 一時的に用意したもの 6 7for i in range(3): 8 for j in range(3): 9 tmp[i] += a1[j][i] * a2[j] 10print(tmp) # デバッグ用 11# ここにベクトルa2にtmpの結果を追加して、(2,3)行列を作成するコードを書く 12np.insert(a2, -1, tmp, axis=0) 13print(a2)

上記のコードで問題となっているのは、
(1). tmpの要素が変更されないまま0となる。
(2). np.insert を行なっているのに、a2 にベクトルtmpが追加されていない。
です。

どなたかお分かりの方がいらっしゃいましたら、教えていただけますでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

(1). tmpの要素が変更されないまま0となる。

python

1tmp = np.array([0, 0, 0])

がint型の配列と解釈されているため、計算がすべて切り捨てられているからです。

(2). np.insert を行なっているのに、a2 にベクトルtmpが追加されていない。

np.insertはin-placeな演算をする関数ではありません(ややこしいですが)。よって、期待する結果を得るにはa2に再代入してやる必要があります。ただし、元がベクトルであり、insertで新しい軸を作ることはできない仕様なので、そうしても期待通り動作しません。


行列積を計算したければ、np.dotで用を達します(ただし列ベクトルを扱いたい場合、素直に書けないので注意が必要。np.c_を使うと強引に列ベクトルっぽいものを作れます。また、np.matrix型を使う方法もあります)。
また、二つのベクトルを縦に連結して新たな配列とする関数はnp.vstackです。よって以下のように書けます。

python

1import numpy as np 2 3a1 = np.array([[0.3, 0.3, 0.4], [0.1, 0.5, 0.4], [0.2, 0.6, 0.2]]) 4a2 = np.array([0.6, 0.25, 0.15]) 5 6a2 = np.vstack([a2, np.dot(a2, a1)]) 7print(a2) 8""" => 9[[0.6 0.25 0.15 ] 10 [0.235 0.395 0.37 ]] 11"""

投稿2018/05/20 08:47

編集2018/05/20 08:50
hayataka2049

総合スコア30933

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

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

IOError

2018/05/20 08:57

早速のご回答ありがとうございます。 (1). ベクトルの要素がint型で認識されていたのですね。 0のままとなっていたため、てっきり変更自体がなされいていないと勘違いしていました。 int型で解釈されていたというかなり初歩的な間違いでしたね。 (2). 行列の積は関数1つで実行できたんですね。 またベクトルの結合に関して、vstack関数というものを初めて知りました。 さらに詳しく調べようと思います。 (1), (2) の問題に対して、私のやりたいことが完璧に解決されていました。 ありがとうございました。
guest

0

python

1import numpy as np 2 3a1 = np.array([[0.3, 0.3, 0.4], [0.1, 0.5, 0.4], [0.2, 0.6, 0.2]]) 4a2 = np.array([0.6, 0.25, 0.15]) 5tmp = np.array([0.0, 0.0, 0.0]) # C0: floatで初期化 6 7for i in range(3): 8 for j in range(3): 9 tmp[i] += a1[j][i] * a2[j] 10print(tmp) # デバッグ用 11# ここにベクトルa2にtmpの結果を追加して、(2,3)行列を作成するコードを書く 12a2 = a2.reshape((1, 3)) # C2: 二次元配列にする 13a2 = np.insert(a2, -1, tmp, axis=0) # C1: 結果を自分に代入する 14print(a2)

(1) tmpの要素が変更されないまま0となる。
__tmp__の初期化時に整数型として初期化されていたためです(Code:C0)。

(2) np.insert を行なっているのに、a2 にベクトルtmpが追加されていない。
です。
insert結果を代入していないからです(Code:C1)。また__a2__が1次元配列で初期化されているため、reshape()で二次元配列にする必要があります(Code:C2)。

投稿2018/05/20 09:16

K_S_

総合スコア419

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

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

IOError

2018/05/21 12:21

ご回答いただきありがとうございます。 (1). python は変数宣言時に型指定する必要がない分、数値計算では型に気をつける必要があるのですね。 見落としていました。 (2). 二次元配列に変形した後に、自分自身に代入という流れにすればよかったんですね。 二次元配列にする必要があることは、非常に勉強になりました。 基本的な質問に関わらず、ご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問