我想绘制一个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图形绘制平面切割的正确方法吗?
答案 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()