2016-07-14 4 views
1

Hilbert spectrumをPythonで3Dプロット(2D配列)として計算します。ヒルベルトスペクトルは、各時間および周波数の組に振幅値を割り当てる形式time x frequency -> amplitudeの関数である。Pythonで2つの1次元配列(2Dプロット)から2D配列(3Dプロット)を作成します(ヒルベルトスペクトルの計算用)

スペクトルを計算する方法は、それぞれが2つの成分、すなわちおよびtime -> amplitudeを有する1つまたは複数の2D信号を入力として取ります。単一の信号aを例に取ってください。 y1は周波数値、y2は振幅値です。

a_x = [1,2,3] 
a_y1 = [1,2,1] 
a_y2 = [4,5,6] 

私は1つの3Dプロットにこれらの2つの2Dのプロットは、そのようなX x Y1 -> Y2それを変換したいと思います。

a(1,1) = 4 
a(2,2) = 5 
a(3,1) = 6 

実際の値は浮動小数点になります。今の私の解決策は、最大値と最小値をy1にとり、0.01などの所定の精度でグリッドを初期化することでした。この例では:

y1_max = np.amax(a_y1) 
y1_min = np.amin(a_y2) 
# Initialise 2d array of zeros 
hilbert_spectrum = np.zeros((len(a_x), len(np.linspace(y1_min, y1_max, 0.01))) 

Iは次にようなグリッドを埋めることになる:

# Fit the old y1 values into new grid 
y1_grid = np.floor((a_y1 - y1_min)/0.01).astype(np.int) 

# Fill the 2D hilbert spectrum 
hilbert_spectrum[1, y1_grid[0]] = 4 
hilbert_spectrum[2, y1_grid[1]] = 5 
hilbert_spectrum[3, y1_grid[2]] = 6 

つ以上の入力信号がある場合しかし、これは複雑になります。これを行うには数学的/簡潔な方法がありますか?出力は、さらに計算に使用できる2D配列でなければなりません。

答えて

0

http://matplotlib.org/examples/mplot3d/trisurf3d_demo2.html

import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.tri as mtri 

a_x = [1,2,3] 
a_y1 = [1,2,1] 
a_y2 = [4,5,6] 

# Triangulate parameter space to determine the triangles 
tri = mtri.Triangulation(a_x, a_y1) 

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1, projection='3d') 

# The triangles in parameter space determine which x, y, z points are 
# connected by an edge 
ax.plot_trisurf(a_x, a_y1, a_y2, triangles=tri.triangles, cmap=plt.cm.Spectral) 

plt.show() 
+0

私はこのことから、実際の2Dアレイを得ることができる場所あなたが私を示していただけますか?私はmatplotlibでポイントをプロットすることができることを知っていましたが、プロットせずに2D配列を取得する必要があります。申し訳ありませんが私の質問が十分に明確でない場合。 – Irondwarf

+0

私はDelaunay三角測量のようなものを提供しました。これは 'scipy.spatial.Delaunay'から得ることができます。あなたが得るデータ構造は2D配列ではありません。これはグラフです(https://en.wikipedia.org/wiki/Graph_(abstract_data_type)を参照)。 –

+0

申し訳ありませんが、グラフから2D配列を生成する方法はわかりません。たぶん私は三角測量の理解の欠如です。 – Irondwarf

関連する問題