저는 수년 동안 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])
그래서 지그재그 대각선 횡단입니까? 거기에 기술적 인 이름이 있습니까? 목적은 무엇입니까? – hpaulj