排列一个numpy数组来表示具有2d颜色图

时间:2017-02-26 20:00:13

标签: python arrays numpy matplotlib

我正在尝试绘制一个代表物理像素集的2d numpy数组。然而,像素本身以非常复杂的方式排列,并且我在排列阵列时遇到问题,因此颜色图将代表物理设置。这是我所拥有的当前数组的布局,下面是它需要组织的布局图片(红色数字表示下面数组的第一个维度。左下象限指的是第二个维度。)I我打算使用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]]

Physical representation. The red numbers refer to the first dimension of the array above. Bottom left quadrant refers to the second dimension.

1 个答案:

答案 0 :(得分:1)

如果将8×8网格视为二维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)

即。对于索引45,row(即y)为6,col为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的样本一维数据数组。它只是[100,101,102,...,163],所以我们可以很容易地看到数组是正确的。

In [116]: data = 100 + np.arange(64.)

要形成8x8数组,首先要创建对应于数据索引[0,1,2,...,63]的行和列索引:

In [117]: row, col = row_col_coords(np.arange(64))

现在创建一个8x8数组,并使用datarow填充col以获得所需的顺序:

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行,等等。要查看&#34中的数据,请更正"顺序,只需反转数组:

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.]])