2016-04-20 2 views
0

Je veux tracer une figure 2D qui est une coupe plane d'un tableau 4D. par exemple:Comment tracer une figure 2D à partir d'un tableau 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]]]]) 

Maintenant, la forme de A est

(3, 3, 3, 3) 

Maintenant, ma question est de savoir comment tracer la figure 2D de ce tableau 4D qui est (Y = 0 et F = 0), et est-ce la bonne façon de tracer un avion coupé d'un chiffre 4D?

Répondre

0

Un plan découpé avec la forme n x m à partir d'une figure spatiale dans des grilles 3D (tracé de surf) peut être tracé en utilisant matplotlib.pyplot.imshow. Si ce n'est pas un complot de surf, cependant, vous pouvez utiliser plot, mais vous devez calculer le contour de votre personnage à partir des dimensions désirées.

from matplotlib.pyplot import imshow, show 

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

La forme peut également ajusté comme suit:

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

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

Cela crée une sortie de forme carrée à partir des données. Vous devez être vigilant lorsque vous remodelez un tableau pour vous assurer que l'intégrité de la forme n'est pas compromise. C'est-à-dire, vous devez vous assurer que m x n de votre tableau remodelé est identique aux deux dimensions dont vous extrayez votre plan (toute combinaison double de x, y ou z).

De plus, vous ne pouvez pas prendre un avion directement à partir de 4D. Vous devez d'abord extraire un tableau 3D, puis un tableau 2D. Par exemple, imaginez une IRM avec 10 expositions (4D: 10 x 50 x 50 x 50). Vous devez d'abord extraire une exposition (3D: 50 x 50 x 50), puis tenter d'afficher une tranche (2D: 50 x 50).

0

Essayez ce code (notez que j'ai créé le tableau multidimensionnel A différemment de vous):

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