Numpyの「スマート」な対称行列
2023-07-30 13:34:59
質問
の位置を自動的に(かつ透過的に)埋める、スマートでスペース効率の良い対称行列はありますか?
[j][i]
の位置を自動的に(そして透過的に)埋めるようなnumpyのスマートな対称行列はありますか?
[i][j]
に書き込まれるのでしょうか?
import numpy
a = numpy.symmetric((3, 3))
a[0][1] = 1
a[1][0] == a[0][1]
# True
print(a)
# [[0 1 0], [1 0 0], [0 0 0]]
assert numpy.all(a == a.T) # for any symmetric matrix
自動的なエルミートもいいですが、執筆時には必要ないでしょう。
どのように解決するのですか?
計算の直前に行列を対称化する余裕があれば、次のようにするとそれなりに速くなります。
def symmetrize(a):
"""
Return a symmetrized version of NumPy array a.
Values 0 are replaced by the array value at the symmetric
position (with respect to the diagonal), i.e. if a_ij = 0,
then the returned array a' is such that a'_ij = a_ji.
Diagonal values are left untouched.
a -- square NumPy array, such that a_ij = 0 or a_ji = 0,
for i != j.
"""
return a + a.T - numpy.diag(a.diagonal())
これは合理的な仮定の下で機能します (例えば、両方の
a[0, 1] = 42
と矛盾する
a[1, 0] = 123
を実行する前に
symmetrize
).
どうしても透過的な対称性が必要な場合は、numpy.ndarrayをサブクラス化し、単純に再定義することを検討するかもしれません。
__setitem__
:
class SymNDArray(numpy.ndarray):
"""
NumPy array subclass for symmetric matrices.
A SymNDArray arr is such that doing arr[i,j] = value
automatically does arr[j,i] = value, so that array
updates remain symmetrical.
"""
def __setitem__(self, (i, j), value):
super(SymNDArray, self).__setitem__((i, j), value)
super(SymNDArray, self).__setitem__((j, i), value)
def symarray(input_array):
"""
Return a symmetrized version of the array-like input_array.
The returned array has class SymNDArray. Further assignments to the array
are thus automatically symmetrized.
"""
return symmetrize(numpy.asarray(input_array)).view(SymNDArray)
# Example:
a = symarray(numpy.zeros((3, 3)))
a[0, 1] = 42
print a # a[1, 0] == 42 too!
(のような、より複雑な代入を行うことができます(あるいは、必要に応じて、配列の代わりに行列を使った同等のものもあります)。 この方法は、例えば
a[:, 1] = -1
のような複雑な代入も扱えます。
a[1, :]
要素を正しく設定します。
Python 3 からは
def …(…, (i, j),…)
を書くことができなくなったので、Python 3で実行する前にコードを少し修正する必要があることに注意してください。
def __setitem__(self, indexes, value): (i, j) = indexes
...
関連
-
[解決済み] NumPyの配列を切り詰めずに、完全に表示するにはどうしたらよいですか?
-
[解決済み] NumPyの配列で、N個の最大値のインデックスを得るには?
-
[解決済み] NumPyでユークリッド距離はどのように計算できますか?
-
[解決済み] NumPy の配列を csv ファイルにダンプする
-
[解決済み] NumPy多次元配列のi番目の列にアクセスする方法は?
-
[解決済み] NumPyで空の配列/行列を作成する方法は?
-
[解決済み] Numpy行列を配列に変換
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] 辞書のキーと値を交換するにはどうすればよいですか?
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] バブルソートの宿題
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?