簡體   English   中英

用python / numpy轉換為向量的矩陣

[英]Matrix to Vector with python/numpy

如果我需要按行或按列創建矢量,Numpy ravel效果很好。 但是,我想通過使用圖像處理中經常使用的方法將矩陣轉換為一維數組。 這是初始矩陣A和最終結果B的示例:

A = np.array([[ 0,  1,  2,  3],
              [ 4,  5,  6,  7],
              [ 8,  9, 10, 11],
              [12, 13, 14, 15]])

B = np.array([[ 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15])

已經有一個現有的功能可以幫助我嗎? 如果沒有,您能給我一些如何解決這個問題的提示嗎? PS。 矩陣ANxN

我已經使用numpy幾年了,但從未見過這樣的功能。

這是一種方法(不一定是最有效的方法):

In [47]: a
Out[47]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [48]: np.concatenate([np.diagonal(a[::-1,:], k)[::(2*(k % 2)-1)] for k in range(1-a.shape[0], a.shape[0])])
Out[48]: array([ 0,  1,  4,  8,  5,  2,  3,  6,  9, 12, 13, 10,  7, 11, 14, 15])

將單線分解為單獨的步驟:

a[::-1, :] ,: a[::-1, :]反轉行:

In [59]: a[::-1, :]
Out[59]: 
array([[12, 13, 14, 15],
       [ 8,  9, 10, 11],
       [ 4,  5,  6,  7],
       [ 0,  1,  2,  3]])

(也可以將其寫為a[::-1]np.flipud(a) 。)

np.diagonal(a, k)提取第k個對角線,其中k=0是主對角線。 因此,例如

In [65]: np.diagonal(a[::-1, :], -3)
Out[65]: array([0])

In [66]: np.diagonal(a[::-1, :], -2)
Out[66]: array([4, 1])

In [67]: np.diagonal(a[::-1, :], 0)
Out[67]: array([12,  9,  6,  3])

In [68]: np.diagonal(a[::-1, :], 2)
Out[68]: array([14, 11])

在列表推導中, k給出要提取的對角線。 我們要反轉每個對角線中的元素。 表達式2*(k % 2) - 1給出值1,-1,1,...,因為k在-3到3之間變化。用[::1]索引使數組的索引順序保持不變,使用[::-1]索引將反轉數組的順序。 所以np.diagonal(a[::-1, :], k)[::(2*(k % 2)-1)]給出第k個對角線,但其他對角線都被反轉了:

In [71]: [np.diagonal(a[::-1,:], k)[::(2*(k % 2)-1)] for k in range(1-a.shape[0], a.shape[0])]
Out[71]: 
[array([0]),
 array([1, 4]),
 array([8, 5, 2]),
 array([ 3,  6,  9, 12]),
 array([13, 10,  7]),
 array([11, 14]),
 array([15])]

np.concatenate()將它們全部放入一個數組中:

In [72]: np.concatenate([np.diagonal(a[::-1,:], k)[::(2*(k % 2)-1)] for k in range(1-a.shape[0], a.shape[0])])
Out[72]: array([ 0,  1,  4,  8,  5,  2,  3,  6,  9, 12, 13, 10,  7, 11, 14, 15])

我發現了有關MATLAB的之字形掃描的討論,但沒有涉及numpy 一個項目似乎使用8x8塊的硬編碼索引數組

https://github.com/lot9s/lfv-compression/blob/master/scripts/our_mpeg/zigzag.py

ZIG = np.array([[0,  1,  5,  6,  14, 15, 27, 28],
               [2,  4,  7,  13, 16, 26, 29, 42],
               [3,  8,  12, 17, 25, 30, 41, 43],
               [9,  11, 18, 24, 31, 40, 44,53],
               [10, 19, 23, 32, 39, 45, 52,54],
               [20, 22, 33, 38, 46, 51, 55,60],
               [21, 34, 37, 47, 50, 56, 59,61],
               [35, 36, 48, 49, 57, 58, 62,63]])

顯然,它使用了jpeg和mpeg壓縮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM