2010-08-19 32 views
8

Tôi có một mảng 2D dữ liệu Numpy được đọc từ tệp .csv. Mỗi hàng đại diện cho một điểm dữ liệu với cột cuối cùng chứa một 'khóa' tương ứng duy nhất với 'khóa' trong một mảng Numpy khác - 'bảng tra cứu' giống như nó.Sử dụng mảng Numpy như bảng tra cứu

Cách tốt nhất (hầu hết Numpythonic) để so khớp các dòng trong bảng đầu tiên với các giá trị trong thứ hai là gì?

+0

Câu trả lời với một tra cứu 'dict' là mát mẻ, nhưng nó rất hiệu quả cho các bảng tra cứu lớn. Nếu bạn muốn "tra cứu" giá trị, bạn có thể sử dụng 'np.interp' với' xp' làm các phím tra cứu của bạn và 'fp' làm giá trị của bạn (mà phải là phao tôi đoán ...). Bằng cách này, tra cứu được thực hiện bằng 'numpy' nguyên gốc thay vì lặp lại python (giả sử bạn muốn đặt một hình ảnh lớn thông qua bảng tra cứu, ví dụ: áp dụng bản đồ màu). –

Trả lời

7

Một số ví dụ dữ liệu:

import numpy as np 

lookup = np.array([[ 1.  , 3.14 , 4.14 ], 
        [ 2.  , 2.71818, 3.7 ], 
        [ 3.  , 42.  , 43.  ]]) 

a = np.array([[ 1, 11], 
       [ 1, 12], 
       [ 2, 21], 
       [ 3, 31]]) 

xây dựng một từ điển từ chìa khóa để chèo số trong bảng tra cứu:

mapping = dict(zip(lookup[:,0], range(len(lookup)))) 

Sau đó, bạn có thể sử dụng từ điển để phù hợp dòng. Ví dụ: nếu bạn chỉ muốn tham gia các bảng:

>>> np.hstack((a, np.array([lookup[mapping[key],1:] 
          for key in a[:,0]]))) 
array([[ 1.  , 11.  , 3.14 , 4.14 ], 
     [ 1.  , 12.  , 3.14 , 4.14 ], 
     [ 2.  , 21.  , 2.71818, 3.7 ], 
     [ 3.  , 31.  , 42.  , 43.  ]])  
+0

+1, xây dựng một dict phụ trợ rõ ràng là con đường để đi. –

+0

+1 để nhận +1 từ Alex Martelli;) Và dĩ nhiên, để có câu trả lời hữu ích. –

+2

Đối với bất kỳ giá trị nào, có một hàm lập sẵn được tích hợp để thực hiện điều này: 'numpy.lib.recfunctions.join_by'. http://projects.scipy.org/numpy/browser/trunk/numpy/lib/recfunctions.py#L826 Nó khá phức tạp nếu bạn chưa sử dụng các mảng có cấu trúc. –

3

Trong trường hợp đặc biệt có thể tính toán từ khóa, từ điển. Đó là một lợi thế khi khóa của bảng tra cứu có thể được chọn.

Ví dụ Vebjorn Ljosa của:

tra cứu:

>>> lookup[a[:,0]-1, :] 
array([[ 1.  , 3.14 , 4.14 ], 
     [ 1.  , 3.14 , 4.14 ], 
     [ 2.  , 2.71818, 3.7 ], 
     [ 3.  , 42.  , 43.  ]]) 

merge:

>>> np.hstack([a, lookup[a[:,0]-1, :]]) 
array([[ 1.  , 11.  , 1.  , 3.14 , 4.14 ], 
     [ 1.  , 12.  , 1.  , 3.14 , 4.14 ], 
     [ 2.  , 21.  , 2.  , 2.71818, 3.7 ], 
     [ 3.  , 31.  , 3.  , 42.  , 43.  ]]) 
Các vấn đề liên quan