2017-02-26 57 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.]])