Python 排列一个numpy数组,用2d颜色图表示物理排列
我试图绘制一个2d numpy数组,它代表一组物理像素。然而,像素本身是以一种非常复杂的方式排列的,我在排列阵列时遇到了问题,因此颜色图将代表物理设置。这是我拥有的当前阵列的布局,下面是它需要组织成的布局的图片(红色数字表示下面阵列的第一个维度。左下象限表示第二个维度)。我打算使用pcolor,但如果有什么更适合这个问题的话,我当然愿意接受其他选择。我将非常感谢在这方面的任何帮助Python 排列一个numpy数组,用2d颜色图表示物理排列,python,arrays,numpy,matplotlib,Python,Arrays,Numpy,Matplotlib,我试图绘制一个2d numpy数组,它代表一组物理像素。然而,像素本身是以一种非常复杂的方式排列的,我在排列阵列时遇到了问题,因此颜色图将代表物理设置。这是我拥有的当前阵列的布局,下面是它需要组织成的布局的图片(红色数字表示下面阵列的第一个维度。左下象限表示第二个维度)。我打算使用pcolor,但如果有什么更适合这个问题的话,我当然愿意接受其他选择。我将非常感谢在这方面的任何帮助 [[ 575.40625 984.40625 560.234375 936.0625 73
[[ 575.40625 984.40625 560.234375 936.0625 733.84375
725.9375 469.234375 828.046875 210.421875 522.4375 713.375
466.484375 679.8125 242.296875 645.328125 666.265625]
[ 976.390625 668.46875 513.328125 769.359375 1343.65625
1068.3125 1206.21875 1447.484375 571.359375 420.71875
246.03125 333.15625 626.921875 615.03125 867.03125
1051.34375 ]
[ 498.1875 1176.453125 670.609375 597.578125 765.078125
713.8125 825.84375 760.171875 667.015625 755.40625
1003.71875 687.921875 448.921875 574.90625 598.859375
487.09375 ]
[ 564.203125 485.140625 652.625 740.875 465.875 1152.03125
623.15625 949.28125 722.515625 397.046875 529.03125 487.
427.109375 424. 495.734375 510.453125]]
如果将8x8栅格视为二维numpy阵列,则一维数据中与给定索引相对应的行将计算为索引位1、3和5的二进制值。类似地,使用索引的位0、2和4计算列。下面是一个将索引转换为行和列的函数:
def row_col_coords(index):
# Convert bits 1, 3 and 5 to row
row = 4*((index & 0b100000) > 0) + 2*((index & 0b1000) > 0) + 1*((index & 0b10) > 0)
# Convert bits 0, 2 and 4 to col
col = 4*((index & 0b10000) > 0) + 2*((index & 0b100) > 0) + 1*((index & 0b1) > 0)
return (row, col)
比如说,
In [114]: row_col_coords(45)
Out[114]: (6, 3)
In [116]: row_col_coords(np.array([45, 46, 47, 48]))
Out[116]: (array([6, 7, 7, 4]), array([3, 2, 3, 4]))
即,对于索引45,行
(即y
)是6,列
是3
计算是矢量化的,因此该函数实际上处理一组索引。比如说,
In [114]: row_col_coords(45)
Out[114]: (6, 3)
In [116]: row_col_coords(np.array([45, 46, 47, 48]))
Out[116]: (array([6, 7, 7, 4]), array([3, 2, 3, 4]))
下面是一个长度为64的一维数据数组示例。它只是[100101102,…,163],所以我们可以很容易地看到数组是正确的
In [116]: data = 100 + np.arange(64.)
要形成8x8阵列,首先创建与数据索引[0,1,2,…,63]相对应的行和列索引:
In [117]: row, col = row_col_coords(np.arange(64))
现在创建一个8x8阵列,并使用行
和列
填充数据,以获得所需的顺序:
In [118]: a = np.empty((8, 8))
In [119]: a[row, col] = data
In [120]: a
Out[120]:
array([[ 100., 101., 104., 105., 116., 117., 120., 121.],
[ 102., 103., 106., 107., 118., 119., 122., 123.],
[ 108., 109., 112., 113., 124., 125., 128., 129.],
[ 110., 111., 114., 115., 126., 127., 130., 131.],
[ 132., 133., 136., 137., 148., 149., 152., 153.],
[ 134., 135., 138., 139., 150., 151., 154., 155.],
[ 140., 141., 144., 145., 156., 157., 160., 161.],
[ 142., 143., 146., 147., 158., 159., 162., 163.]])
行是颠倒的!这是因为numpy数组首先显示第0行,然后显示第1行,以此类推。要按“正确”的顺序查看数据,只需反转数组:
In [121]: a[::-1]
Out[121]:
array([[ 142., 143., 146., 147., 158., 159., 162., 163.],
[ 140., 141., 144., 145., 156., 157., 160., 161.],
[ 134., 135., 138., 139., 150., 151., 154., 155.],
[ 132., 133., 136., 137., 148., 149., 152., 153.],
[ 110., 111., 114., 115., 126., 127., 130., 131.],
[ 108., 109., 112., 113., 124., 125., 128., 129.],
[ 102., 103., 106., 107., 118., 119., 122., 123.],
[ 100., 101., 104., 105., 116., 117., 120., 121.]])
点的排列是一条空间填充Z曲线。也许这有助于您入门。您提供的嵌套列表中的每一行都对应于下图中的一个红色框?如果是这样的话,那么我看到了一个问题。每个红色框具有相同数量的元素,但是,在嵌套列表中,有些有6个元素,有些有5个元素。此外,每个嵌套列表如何分布在红色框中,即按列、按行或其他方式?@MartinUeding Good point。你知道在numpy中我可以使用什么吗?我可以将数组展平,然后使用一种算法,使用z阶曲线形成物理结构?@FilipKilibarda上述数组的尺寸由方括号指定,而不是物理行。如果不清楚的话,我道歉。第一维中的索引对应于红色框,第二维中的索引对应于黑色数字(特别是在左下角,然后在其他红色框中重复三次)。您的实际输入是否只是一个一维序列(包含64个元素),您希望将其打印为8x8图像,将索引放入蓝色网格中所示的序列中?