2016-09-11 2 views
1

Numpy ravel은 행이나 열로 읽음으로써 벡터를 만들어야하는 경우 잘 작동합니다. 그러나 이미지 처리에 자주 사용되는 방법을 사용하여 행렬을 1 차원 배열로 변환하고 싶습니다. 기존에 이미 기능이가 나를 도울 수는python을 사용하는 Matrix to numpy

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

있습니까 :이 초기 매트릭스 A 및 최종 결과 B와 예입니다? 그렇지 않다면이 문제를 해결하는 방법에 대한 힌트를 나에게 줄 수 있습니까? 추신. 행렬 ANxN입니다.

+0

그래서 지그재그 대각선 횡단입니까? 거기에 기술적 인 이름이 있습니까? 목적은 무엇입니까? – hpaulj

답변

4

저는 수년 동안 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]) 

별도의 단계로 한 줄 아래로 속보 :

은 여기에 (반드시 가장 효율적인을)를 할 수있는 하나의 방법입니다

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, :]은 행을 반전

(이것은 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이라는 표현식은 k이 -3에서 3까지 변하는 값 1, -1, 1, ...을 제공합니다. [::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]) 
1

내가 MATLAB에 대한 지그재그 스캔의 토론을 찾았지만별로 numpy에 있습니다. 하나 개의 프로젝트는 8 × 8 블록

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 압축

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

에 대한 하드 인덱싱 배열을 사용하여 나타납니다.