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