Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 排列一个numpy数组,用2d颜色图表示物理排列_Python_Arrays_Numpy_Matplotlib - Fatal编程技术网

Python 排列一个numpy数组,用2d颜色图表示物理排列

Python 排列一个numpy数组,用2d颜色图表示物理排列,python,arrays,numpy,matplotlib,Python,Arrays,Numpy,Matplotlib,我试图绘制一个2d numpy数组,它代表一组物理像素。然而,像素本身是以一种非常复杂的方式排列的,我在排列阵列时遇到了问题,因此颜色图将代表物理设置。这是我拥有的当前阵列的布局,下面是它需要组织成的布局的图片(红色数字表示下面阵列的第一个维度。左下象限表示第二个维度)。我打算使用pcolor,但如果有什么更适合这个问题的话,我当然愿意接受其他选择。我将非常感谢在这方面的任何帮助 [[ 575.40625 984.40625 560.234375 936.0625 73

我试图绘制一个2d numpy数组,它代表一组物理像素。然而,像素本身是以一种非常复杂的方式排列的,我在排列阵列时遇到了问题,因此颜色图将代表物理设置。这是我拥有的当前阵列的布局,下面是它需要组织成的布局的图片(红色数字表示下面阵列的第一个维度。左下象限表示第二个维度)。我打算使用pcolor,但如果有什么更适合这个问题的话,我当然愿意接受其他选择。我将非常感谢在这方面的任何帮助

[[  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图像,将索引放入蓝色网格中所示的序列中?