2016-04-20 21 views
0

4次元配列から平面図である2次元図形をプロットする必要があります。例えば :4D配列から2次元図形をプロットする方法

In[1]: 
x = [0, 1, 2] 
y = [3, 4, 5] 
z = [6, 7, 8] 
f = [9, 10, 11] 
X, Y, Z, F = meshgrid(x, y, z, f) #create 4D grid 


Out[1]: 
array([[[[0, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0]], 

     [[1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1]], 

     [[2, 2, 2], 
     [2, 2, 2], 
     [2, 2, 2]]], 


     [[[0, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0]], 

     [[1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1]], 

     [[2, 2, 2], 
     [2, 2, 2], 
     [2, 2, 2]]], 


     [[[0, 0, 0], 
     [0, 0, 0], 
     [0, 0, 0]], 

     [[1, 1, 1], 
     [1, 1, 1], 
     [1, 1, 1]], 

     [[2, 2, 2], 
     [2, 2, 2], 
     [2, 2, 2]]]]) 

In[2]: 
A = X + 1j*Y + Z + 1j* F 

Out[2]: 
array([[[[ 6.+12.j, 6.+13.j, 6.+14.j], 
     [ 7.+12.j, 7.+13.j, 7.+14.j], 
     [ 8.+12.j, 8.+13.j, 8.+14.j]], 

     [[ 7.+12.j, 7.+13.j, 7.+14.j], 
     [ 8.+12.j, 8.+13.j, 8.+14.j], 
     [ 9.+12.j, 9.+13.j, 9.+14.j]], 

     [[ 8.+12.j, 8.+13.j, 8.+14.j], 
     [ 9.+12.j, 9.+13.j, 9.+14.j], 
     [ 10.+12.j, 10.+13.j, 10.+14.j]]], 


     [[[ 6.+13.j, 6.+14.j, 6.+15.j], 
     [ 7.+13.j, 7.+14.j, 7.+15.j], 
     [ 8.+13.j, 8.+14.j, 8.+15.j]], 

     [[ 7.+13.j, 7.+14.j, 7.+15.j], 
     [ 8.+13.j, 8.+14.j, 8.+15.j], 
     [ 9.+13.j, 9.+14.j, 9.+15.j]], 

     [[ 8.+13.j, 8.+14.j, 8.+15.j], 
     [ 9.+13.j, 9.+14.j, 9.+15.j], 
     [ 10.+13.j, 10.+14.j, 10.+15.j]]], 


     [[[ 6.+14.j, 6.+15.j, 6.+16.j], 
     [ 7.+14.j, 7.+15.j, 7.+16.j], 
     [ 8.+14.j, 8.+15.j, 8.+16.j]], 

     [[ 7.+14.j, 7.+15.j, 7.+16.j], 
     [ 8.+14.j, 8.+15.j, 8.+16.j], 
     [ 9.+14.j, 9.+15.j, 9.+16.j]], 

     [[ 8.+14.j, 8.+15.j, 8.+16.j], 
     [ 9.+14.j, 9.+15.j, 9.+16.j], 
     [ 10.+14.j, 10.+15.j, 10.+16.j]]]]) 

今Aの形状は

(3, 3, 3, 3) 

ある今私の質問は、(Y = 0、F = 0)であり、この4D配列から2D図をプロットする方法であり、そしてこれは、4Dフィギュアから平面カットをプロットする正しい方法ですか?

答えて

0

3Dグリッド(サーフプロット)の空間図形から形状n x mの平面カットをmatplotlib.pyplot.imshowを使用してプロットすることができます。しかし、サーフプロットでない場合は、plotを使用することができますが、希望の寸法から図形の輪郭を計算する必要があります。次のように

from matplotlib.pyplot import imshow, show 

imshow(variable, interpolation='none') 
show() 

形状も調整することができる:

# Given |variable| is an object of type numpy.array: 

var_reshaped = variable.reshape(int(variable.size/2), -1) 

これは、データから正方形状の出力を作成します。シェイプの完全性が損なわれないように、配列を再構成するときは注意が必要です。つまり、再構成された配列のm x nが、プレーンを抽出する2つの次元(x、y、zの二重の任意の組み合わせ)と同じであることを確認する必要があります。

また、4Dから直接飛行機を利用することはできません。最初に3D配列を抽出し、次に2D配列を抽出する必要があります。例えば、10回の曝露(4D:10×50×50×50)のMRIを想像してください。まず、1回の露光(3D:50 x 50 x 50)を抽出してから、スライス(2D:50 x 50)を表示する必要があります。

0

(私は異なりますから多次元配列Aを作成していることに注意してください)このコードを試してみてください。

In [1]: import numpy as np 

In [2]: from matplotlib import pyplot as plt 

In [3]: X, Y, Z, F = 2, 3, 4, 5 

In [4]: A = np.arange(X*Y*Z*F).reshape(X, Y, Z, F) 

In [5]: A 
Out[5]: 
array([[[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [ 10, 11, 12, 13, 14], 
     [ 15, 16, 17, 18, 19]], 

     [[ 20, 21, 22, 23, 24], 
     [ 25, 26, 27, 28, 29], 
     [ 30, 31, 32, 33, 34], 
     [ 35, 36, 37, 38, 39]], 

     [[ 40, 41, 42, 43, 44], 
     [ 45, 46, 47, 48, 49], 
     [ 50, 51, 52, 53, 54], 
     [ 55, 56, 57, 58, 59]]], 


     [[[ 60, 61, 62, 63, 64], 
     [ 65, 66, 67, 68, 69], 
     [ 70, 71, 72, 73, 74], 
     [ 75, 76, 77, 78, 79]], 

     [[ 80, 81, 82, 83, 84], 
     [ 85, 86, 87, 88, 89], 
     [ 90, 91, 92, 93, 94], 
     [ 95, 96, 97, 98, 99]], 

     [[100, 101, 102, 103, 104], 
     [105, 106, 107, 108, 109], 
     [110, 111, 112, 113, 114], 
     [115, 116, 117, 118, 119]]]]) 

In [6]: plane_cut = A[:, 0, :, 0] 

In [7]: plane_cut 
Out[7]: 
array([[ 0, 5, 10, 15], 
     [60, 65, 70, 75]]) 

In [8]: plt.matshow(plane_cut); plt.show() 

Plane cut of a multidimensional array

関連する問題