2017-02-26 25 views
2

我想绘制一个代表物理像素集的2d numpy数组。但是,像素本身的排列方式非常复杂,我无法排列阵列,因此颜色图表会代表物理设置。这里是我有的当前数组的布局,下面是它需要组织的布局的图片(红色数字指的是下面数组的第一维,左下象限指的是第二维)。我打算使用pcolor,但如果有什么更适合这个问题的话,我肯定会接受其他选择。我将不胜感激任何帮助。安排一个numpy数组来表示物理排列与2d彩色阴谋

[[ 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.

+2

点的排列是填充Z曲线的空间。也许这有助于你开始。 –

+0

您提供的嵌套列表中的每一行对应于下图中的红色框?如果是这样的话,那么我看到一个问题。每个红色框都有相同数量的元素,但是,在您的嵌套列表中,有些元素有6个元素,一些有5个元素。另外,每个嵌套列表如何分布在红色框中,即列明,行明,其他办法? –

+0

@MartinUeding好点。你知道在numpy中有什么我可以使用的地方,我可以压扁阵列,然后使用算法来使用z阶曲线形成物理结构? – cadams

回答

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

为了形成8×8阵列,首先创建行和列索引对应于数据索引[0,1,2,...,63]:

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

现在创建一个8x8的阵列与data填充它,使用rowcol以获得所需的顺序:

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