如何将2D图形绘制成4D阵列

时间:2016-04-20 09:45:08

标签: python arrays multidimensional-array plot slice

我想绘制一个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)

现在我的问题是如何从这个4D数组中绘制2D图形(Y = 0和F = 0),这是从4D图形绘制平面切割的正确方法吗?

2 个答案:

答案 0 :(得分:0)

可以使用n x m绘制从3D网格(冲浪图)中的空间图形切割出具有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与您从中提取平面的两个维度相同(x,y或z的任意组合)。

另外,你不能直接从4D乘坐飞机。您必须首先提取3D数组,然后提取2D数组。例如,想象一下具有10次曝光的MRI(4D:10 x 50 x 50 x 50)。您必须先提取一次曝光(3D:50 x 50 x 50),然后尝试显示切片(2D:50 x 50)。

答案 1 :(得分: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