2016-04-20 95 views
0

我想繪製一個2D圖形,這是一個4D陣列的平面切割。 例如:如何繪製一個2D圖形形成一個4D陣列

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圖中繪製平面切割的正確方法嗎?

回答

0

使用matplotlib.pyplot.imshow可以繪製出一個在3D網格(衝浪地塊)中從空間圖切割出形狀爲n x m的平面。但是,如果它不是衝浪地塊,則可以使用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重整陣列與您從中提取平面的兩個維度(x,y或z的任意雙重組合)完全相同。

此外,你不能直接從4D乘坐飛機。您必須首先提取3D數組,然後使用2D數組。例如,想象一下10次曝光的MRI(4D:10×50×50×50)。您必須首先提取一個曝光(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