본문 바로가기
Programming/Python

Numpy 배열 값 브로드캐스트

by Lunethan 2021. 1. 1.

 

Question


다중 중복이 있는 1차 2차원 누피 배열과 1차 값의 2차 배열이 있습니다.

 

[[ 0  0  1 ]
 [ 1  0  2 ]
 [ 2  0  2 ]
 ...
 [ 0  0  1 ]
 [ 3  0  2 ]
 [ 2  0  2 ]]

[[ 0  0  1 ]
 [ 1  0  2 ]
 [ 2  0  2 ]
 [ 3  0  2 ]]

 

세 번째 2차원 배열(두 번째 배열과 행 수가 동일)에는 두 번째 배열의 해당 행에서 생성되는 몇 가지 추가 값이 포함됩니다.

 

[[ 2 -0.5]
 [ 2.4  0.5]
 [ 2.5  0.4]
 [ 2.4  1]]

 

첫 번째의 값은 키로, 세 번째의 값은 콘텐츠로 사용하여 새 배열을 만드는 것입니다. 주문은 유지되어야 합니다.

 

[[ 2 -0.5]
 [ 2.4  0.5]
 [ 2.5  0.4]
 ...
 [ 2 -0.5]
 [ 2.4  1]
 [ 2.5  0.4]]

 

팬더 DFS(첫 번째 배열에서 하나, 두 번째 + 세 번째 배열에서 하나)를 만들고 처음 세 개의 열에 팬더를 병합하려고 했지만, 그 결과가 너무 느립니다.

 

Answer



일반적으로 브로드캐스트 평등을 사용하여 다음과 같은 적절한 인덱스를 찾을 수 있습니다.

 

x = np.array([[ 0,  0,  1 ],
              [ 1,  0,  2 ],
              [ 2,  0,  2 ],
              [ 0,  0,  1 ],
              [ 3,  0,  2 ],
              [ 2,  0,  2 ]])

x_unique = np.array([[ 0,  0,  1 ],
                     [ 1,  0,  2 ],
                     [ 2,  0,  2 ],
                     [ 3,  0,  2 ]])

values = np.array([[ 2, -0.5],
                   [ 2.4,  0.5],
                   [ 2.5,  0.4],
                   [ 2.4,  1]])

index = np.argmax((x[:, None] == x_unique).all(-1), axis=1)
values[index]
# array([[ 2. , -0.5],
#        [ 2.4,  0.5],
#        [ 2.5,  0.4],
#        [ 2. , -0.5],
#        [ 2.4,  1. ],
#        [ 2.5,  0.4]])
If you are generating the unique values using np.unique, you can do this more efficiently by computing the indices when you extract the unique values:

x_unique2, index = np.unique(x, axis=0, return_inverse=True)
assert np.allclose(x_unique, x_unique2)  # same as above
print(values[index])
# array([[ 2. , -0.5],
#        [ 2.4,  0.5],
#        [ 2.5,  0.4],
#        [ 2. , -0.5],
#        [ 2.4,  1. ],
#        [ 2.5,  0.4]])

 

댓글