使用Numpy数组作为查找表

Bre*_*dan 8 python numpy

我有一个从.csv文件中读取的Numpy数据的2D数组.每行代表一个数据点,最后一列包含一个'key',它唯一对应于另一个Numpy数组中的'key' - '查询表'.

将第一个表中的行与第二个表中的值匹配的最佳(最Numpythonic)方法是什么?

Veb*_*osa 8

一些示例数据:

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]])
Run Code Online (Sandbox Code Playgroud)

在查找表中从键到行号构建字典:

mapping = dict(zip(lookup[:,0], range(len(lookup))))
Run Code Online (Sandbox Code Playgroud)

然后你可以使用字典来匹配线条.例如,如果您只想加入表格:

>>> 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.     ]])    
Run Code Online (Sandbox Code Playgroud)

  • 无论它有什么价值,都有一个内置的numpy函数来执行此操作:`numpy.lib.recfunctions.join_by`.http://projects.scipy.org/numpy/browser/trunk/numpy/lib/recfunctions.py#L826它,如果你还没有使用结构化阵列,虽然是相当沉闷. (2认同)

Jos*_*sef 5

在可以根据键计算索引的特殊情况下,可以避免使用字典。当可以选择查找表的键时这是一个优点。

对于 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.     ]])
Run Code Online (Sandbox Code Playgroud)

合并:

>>> 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.     ]])
Run Code Online (Sandbox Code Playgroud)