2010-08-19 47 views
8

我有一個從.csv文件讀取的Numpy數據的二維數組。每一行都代表一個數據點,最後一列包含一個'key',它唯一對應於另一個Numpy數組中的'key' - 'lookup table'。使用Numpy數組作爲查找表

什麼是最好的(最Numpythonic)方式來匹配第一個表中的行和第二個中的值?

+0

的查找答案'dict'是很酷,但它是大的查找表非常無效。如果你想「查找」值,你可以使用帶'xp'的'np.interp'作爲你的查找鍵和'fp'作爲你的值(我猜這肯定是浮點數)。這樣,查找是用原生'numpy'完成的,而不是python迭代(例如,您想通過查找表放大圖像,例如應用彩色圖)。 – 2017-12-06 18:30:16

回答

7

一些示例數據:

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

建立從關鍵一本字典來排在查找表編號:

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

然後你可以用字典來匹配行。例如,如果您只想加入表格:

>>> 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,建立一個輔助字典顯然是要走的路。 – 2010-08-19 15:25:52

+0

+1從Alex Martelli獲得+1;)當然,還有一個有用的答案。 – 2010-08-19 15:49:37

+2

無論它值什麼,都有一個內置的numpy函數來執行此操作:'numpy.lib.recfunctions.join_by'。 http://projects.scipy.org/numpy/browser/trunk/numpy/lib/recfunctions.py#L826儘管如此,如果你還沒有使用結構化數組,它會非常笨重。 – 2010-08-19 15:53:26

3

在特殊情況下,可以通過鍵計算索引,避免使用字典。當查找表的關鍵字可以被選擇時,這是一個優點。

對於Vebjorn Ljosa的例子:

查找:

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

合併:

>>> 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.  ]])