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

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

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

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

Python 3.x

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

Python

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

Q&A

3回答

6813閲覧

numpyで配列の対角行列に値を代入したい

babbleman

総合スコア107

NumPy

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/08/01 06:41

8×8の行列があったとして、一つ上の対角行列に任意の配列を挿入したい場合はどのようにしたら良いのでしょうか?

python3

1diag = np.diag(some_nd_array, 1) 2

このようにすればsome_nd_arrayの対角行列を取得することは出来るのですが、この対角行列のインデックスを取得するやり方がわからない為値を代入することが出来ないです。

python3

1s=np.diag_indices(8)

このようにすれば完全対角のインデックスは取得できるのですが、やはり一つ上にずらしたインデックスを取得することが出来ません。
もしもこれを取得するやり方がない場合、自力でインデックスを取得する処理を書くしかないでしょうか?
ご回答の程宜しくお願い致します。

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

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

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

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

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

guest

回答3

0

こういう感じです。

python

1>>> a = np.zeros(64, dtype=int).reshape(8,8) 2>>> print(a) 3[[0 0 0 0 0 0 0 0] 4 [0 0 0 0 0 0 0 0] 5 [0 0 0 0 0 0 0 0] 6 [0 0 0 0 0 0 0 0] 7 [0 0 0 0 0 0 0 0] 8 [0 0 0 0 0 0 0 0] 9 [0 0 0 0 0 0 0 0] 10 [0 0 0 0 0 0 0 0]] 11>>> v= np.arange(1,8) 12>>> print(v) 13[1 2 3 4 5 6 7] 14>>> a[:-1,1:][np.diag_indices(7)] = v 15>>> print(a) 16[[0 1 0 0 0 0 0 0] 17 [0 0 2 0 0 0 0 0] 18 [0 0 0 3 0 0 0 0] 19 [0 0 0 0 4 0 0 0] 20 [0 0 0 0 0 5 0 0] 21 [0 0 0 0 0 0 6 0] 22 [0 0 0 0 0 0 0 7] 23 [0 0 0 0 0 0 0 0]]

投稿2021/08/01 07:23

ppaul

総合スコア24672

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

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

0

対角に配列を代入する場合は、np.fill_diagonal()関数を用います。
np.diag_indices()でインデックスを取得してから代入すると二度手間になりますので、np.fill_diagonal()を使用したほうが高速に動作します。

python

1# 実行例 2In [11]: a = np.zeros(64, dtype=int).reshape(8, 8) 3 ...: a 4Out[11]: 5array([[0, 0, 0, 0, 0, 0, 0, 0], 6 [0, 0, 0, 0, 0, 0, 0, 0], 7 [0, 0, 0, 0, 0, 0, 0, 0], 8 [0, 0, 0, 0, 0, 0, 0, 0], 9 [0, 0, 0, 0, 0, 0, 0, 0], 10 [0, 0, 0, 0, 0, 0, 0, 0], 11 [0, 0, 0, 0, 0, 0, 0, 0], 12 [0, 0, 0, 0, 0, 0, 0, 0]]) 13 14In [12]: v = np.arange(1, 8) 15 ...: np.fill_diagonal(a[:, 1:], v) 16 17In [13]: a 18Out[13]: 19array([[0, 1, 0, 0, 0, 0, 0, 0], 20 [0, 0, 2, 0, 0, 0, 0, 0], 21 [0, 0, 0, 3, 0, 0, 0, 0], 22 [0, 0, 0, 0, 4, 0, 0, 0], 23 [0, 0, 0, 0, 0, 5, 0, 0], 24 [0, 0, 0, 0, 0, 0, 6, 0], 25 [0, 0, 0, 0, 0, 0, 0, 7], 26 [0, 0, 0, 0, 0, 0, 0, 0]])

投稿2021/08/06 01:18

kirara0048

総合スコア1399

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

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

0

エラーチェックとかは入っていませんが、numpy.arange()でこんな感じに作れます。

python

1import numpy as np 2 3def kth_diag_indices(n, k=0): 4 idx = np.arange(n - abs(k)) 5 if k >= 0: 6 return (idx, idx + k) 7 else: 8 return (idx - k, idx) 9 10arr = np.zeros((8, 8)) 11 12arr[kth_diag_indices(8, 1)] = 1 13arr[kth_diag_indices(8, -2)] = 2 14print(arr) 15#[[0. 1. 0. 0. 0. 0. 0. 0.] 16# [0. 0. 1. 0. 0. 0. 0. 0.] 17# [2. 0. 0. 1. 0. 0. 0. 0.] 18# [0. 2. 0. 0. 1. 0. 0. 0.] 19# [0. 0. 2. 0. 0. 1. 0. 0.] 20# [0. 0. 0. 2. 0. 0. 1. 0.] 21# [0. 0. 0. 0. 2. 0. 0. 1.] 22# [0. 0. 0. 0. 0. 2. 0. 0.]]

投稿2021/08/01 14:36

bsdfan

総合スコア4899

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問