Tôi có một mảng/thiết lập với số nguyên dương độc đáo, tức làNumPy tìm chỉ số phần tử trong mảng khác
>>> unique = np.unique(np.random.choice(100, 4, replace=False))
Và một mảng chứa nhiều phần tử được lấy mẫu từ mảng trước đây, chẳng hạn như
>>> A = np.random.choice(unique, 100)
Tôi muốn ánh xạ các giá trị của mảng A
đến vị trí mà các giá trị đó xuất hiện trong unique
.
Cho đến nay các giải pháp tốt nhất mà tôi tìm thấy là thông qua một mảng bản đồ:
>>> table = np.zeros(unique.max()+1, unique.dtype)
>>> table[unique] = np.arange(unique.size)
Các chuyển nhượng trên để mỗi phần tử chỉ số trên mảng, và do đó, có thể được sử dụng sau này để lập bản đồ A
qua indexing tiên tiến:
>>> table[A]
array([2, 2, 3, 3, 3, 3, 1, 1, 1, 0, 2, 0, 1, 0, 2, 1, 0, 0, 2, 3, 0, 0, 0,
0, 3, 3, 2, 1, 0, 0, 0, 2, 1, 0, 3, 0, 1, 3, 0, 1, 2, 3, 3, 3, 3, 1,
3, 0, 1, 2, 0, 0, 2, 3, 1, 0, 3, 2, 3, 3, 3, 1, 1, 2, 0, 0, 2, 0, 2,
3, 1, 1, 3, 3, 2, 1, 2, 0, 2, 1, 0, 1, 2, 0, 2, 0, 1, 3, 0, 2, 0, 1,
3, 2, 2, 1, 3, 0, 3, 3], dtype=int32)
Điều này đã mang lại cho tôi giải pháp phù hợp. Tuy nhiên, nếu các số duy nhất trong unique
rất thưa thớt và lớn, cách tiếp cận này ngụ ý tạo một mảng table
rất lớn chỉ để lưu trữ một vài số để ánh xạ sau này.
Có giải pháp nào tốt hơn?
LƯU Ý: cả hai A
và unique
là các mảng mẫu, không mảng thực. Vì vậy, vấn đề không phải là làm thế nào để tạo ra chỉ số vị trí, nó chỉ là làm thế nào để lập bản đồ một cách hiệu quả các yếu tố của A
để chỉ số trong unique
, các giả về những gì tôi muốn tăng tốc trong NumPy được như sau,
B = np.zeros_like(A)
for i in range(A.size):
B[i] = unique.index(A[i])
(giả sử unique
là một danh sách ở trên mã giả).
Và 'sorter' có thể được sử dụng với nó, nếu' unique' chưa được sắp xếp. – Divakar