2010-08-19 45 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.  ]])