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

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

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

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

Q&A

解決済

2回答

2483閲覧

Python : 行列の要素の書き換え

TeRa_130

総合スコア61

Python

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

0グッド

0クリップ

投稿2018/11/18 02:23

実現したいこと

pythonを使用しています。

python

1import numpy as np 2 3a = np.array([[0,1,0],[1,0,2],[0,2,0]]) 4b = np.array([[1000,1,0],[1,1000,2],[0,2,1000]])

この正方行列(a)の対角要素だけ 1000 に置換して、
正方行列(b)にしたいです。

どうすればよいでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

これで良いのでは。

python

1a[0,0] = a[1,1] = a[2,2] = 1000

ちょっと凝ってみると、こうした方がスマートかもしれません。

python

1a[np.eye(3, dtype=bool)] = 1000

あるいはこんな。

python

1a + 1000*np.eye(3)

実行例

python

1>>> import numpy as np 2>>> a = np.array([[0,1,0],[1,0,2],[0,2,0]]) 3>>> a 4array([[0, 1, 0], 5 [1, 0, 2], 6 [0, 2, 0]]) 7>>> a[0,0] = a[1,1] = a[2,2] = 1000 8>>> a 9array([[1000, 1, 0], 10 [ 1, 1000, 2], 11 [ 0, 2, 1000]]) 12>>> a = np.array([[0,1,0],[1,0,2],[0,2,0]]) 13>>> a[np.eye(3, dtype=bool)] = 1000 14>>> a 15array([[1000, 1, 0], 16 [ 1, 1000, 2], 17 [ 0, 2, 1000]]) 18>>> a = np.array([[0,1,0],[1,0,2],[0,2,0]]) 19>>> a + 1000*np.eye(3) 20array([[1000., 1., 0.], 21 [ 1., 1000., 2.], 22 [ 0., 2., 1000.]])

最後の方法以外はin-placeで処理するので、もとのaを残して別途bを作りたければ配列のコピー操作をする必要があります。

投稿2018/11/18 02:30

編集2018/11/18 02:50
hayataka2049

総合スコア30933

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

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

can110

2018/11/18 02:44

「a[np.eye(3, dtype=bool)] = 1000」はスマートですね。
guest

0

以下でどうでしょう。

Python

1import numpy as np 2a = np.array([[0,1,0],[1,0,2],[0,2,0]]) 3 4# (念のため対角成分を0にして)単位行列*1000を足す 5n = a.shape[0] # 3 6b = a * (np.ones((n,n)) - np.eye(n)) + np.eye(n) * 1000 7print(b) 8""" 9[[1000. 1. 0.] 10 [ 1. 1000. 2.] 11 [ 0. 2. 1000.]] 12"""

投稿2018/11/18 02:37

can110

総合スコア38266

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問