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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

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

Python

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

Q&A

解決済

1回答

1307閲覧

2dカラーマップでの線形補間におけるsingular matrixのエラー

simasima

総合スコア49

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

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

Python

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

0グッド

0クリップ

投稿2018/04/19 06:24

前提・実現したいこと

以下のようにscipyを用いて、線形補間を用いた2Dプロットを作成しようと考えています。

発生している問題・エラーメッセージ

python

1print(x, y, z)

[ 0. 0.0197 0.0399 ..., 0.0602 0.0402 0.0202] [ 150. 150. 150. ..., 1000. 1000. 1000.] [ 0.0038828 0.0016416 0.0033378 ..., 0.23935 0.2409 0.23913 ]

python

1import numpy as np 2import matplotlib.pyplot as plt 3import scipy.interpolate 4 5# Set up a regular grid of interpolation points 6xi, yi = np.linspace(x.min(), x.max(), 100), np.linspace(y.min(), y.max(), 100) 7xi, yi = np.meshgrid(xi, yi) 8 9# Interpolate 10rbf = scipy.interpolate.Rbf(x, y, z, function='linear') 11zi = rbf(xi, yi) 12 13plt.imshow(zi, vmin=z.min(), vmax=z.max(), origin='lower', 14 extent=[x.min(), x.max(), y.min(), y.max()]) 15plt.scatter(x, y, c=z) 16plt.colorbar() 17plt.show()

のようにすると、

LinAlgError Traceback (most recent call last)
<ipython-input-53-ceae274e1d6d> in <module>()
8
9 # Interpolate
---> 10 rbf = scipy.interpolate.Rbf(x, y, z, function='linear')
11 zi = rbf(xi, yi)
12

/opt/conda/lib/python3.5/site-packages/scipy/interpolate/rbf.py in init(self, *args, **kwargs)
220
221 self.A = self._init_function(r) - np.eye(self.N)*self.smooth
--> 222 self.nodes = linalg.solve(self.A, self.di)
223
224 def _call_norm(self, x1, x2):

/opt/conda/lib/python3.5/site-packages/scipy/linalg/basic.py in solve(a, b, sym_pos, lower, overwrite_a, overwrite_b, debug, check_finite)
101 return x
102 if info > 0:
--> 103 raise LinAlgError("singular matrix")
104 raise ValueError('illegal value in %d-th argument of internal gesv|posv' %
105 -info)

LinAlgError: singular matrix

とのエラーが出ます。

もしお分かりのかたがいましたらよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

https://stackoverflow.com/questions/19237512/rbf-interpolation-linalgerror-singular-matrix

点が重なっているので、補間する際に行列のランクが落ちて計算できなくなっています。


python

1import numpy as np 2import matplotlib.pyplot as plt 3import scipy.interpolate 4 5x = np.array([0., 0.0197, 0.0399, 0.0602, 0.0402, 0.0202]) 6y = np.array([150., 150., 150., 1000., 1000., 1000.]) 7z = np.array([0.0038828, 0.0016416, 0.0033378, 0.23935, 0.2409, 0.23913]) 8 9# Set up a regular grid of interpolation points 10xi, yi = np.linspace(x.min(), x.max(), 100), np.linspace(y.min(), y.max(), 100) 11xi, yi = np.meshgrid(xi, yi) 12 13# Interpolate 14rbf = scipy.interpolate.Rbf(x, y, z, function='linear') 15zi = rbf(xi, yi) 16 17plt.imshow(zi, vmin=z.min(), vmax=z.max(), origin='lower', 18 extent=[x.min(), x.max(), y.min(), y.max()]) 19plt.scatter(x, y, c=z) 20plt.colorbar() 21plt.show()

投稿2018/04/19 11:03

編集2018/04/19 12:01
mkgrei

総合スコア8560

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

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

simasima

2018/04/19 11:56

すみません、具体的にどこの点が重なっているのでしょうか?
mkgrei

2018/04/19 12:03

コードを追記しましたが、そちらは点が重なっていないのでエラーはありません。 (x, y, z)の点がたくさんありますが、重複するものがあるとエラーになります。 そして、質問文で見えている限りでは重複のものがありません。
simasima

2018/04/19 12:16

丁寧なご説明ありがとうございます。 重複している点に関する例外処理を行って対処したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問