我有一個從.csv文件讀取的Numpy數據的二維數組。每一行都代表一個數據點,最後一列包含一個'key',它唯一對應於另一個Numpy數組中的'key' - 'lookup table'。使用Numpy數組作爲查找表
什麼是最好的(最Numpythonic)方式來匹配第一個表中的行和第二個中的值?
我有一個從.csv文件讀取的Numpy數據的二維數組。每一行都代表一個數據點,最後一列包含一個'key',它唯一對應於另一個Numpy數組中的'key' - 'lookup table'。使用Numpy數組作爲查找表
什麼是最好的(最Numpythonic)方式來匹配第一個表中的行和第二個中的值?
一些示例數據:
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. ]])
+1,建立一個輔助字典顯然是要走的路。 – 2010-08-19 15:25:52
+1從Alex Martelli獲得+1;)當然,還有一個有用的答案。 – 2010-08-19 15:49:37
無論它值什麼,都有一個內置的numpy函數來執行此操作:'numpy.lib.recfunctions.join_by'。 http://projects.scipy.org/numpy/browser/trunk/numpy/lib/recfunctions.py#L826儘管如此,如果你還沒有使用結構化數組,它會非常笨重。 – 2010-08-19 15:53:26
在特殊情況下,可以通過鍵計算索引,避免使用字典。當查找表的關鍵字可以被選擇時,這是一個優點。
對於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. ]])
的查找答案'dict'是很酷,但它是大的查找表非常無效。如果你想「查找」值,你可以使用帶'xp'的'np.interp'作爲你的查找鍵和'fp'作爲你的值(我猜這肯定是浮點數)。這樣,查找是用原生'numpy'完成的,而不是python迭代(例如,您想通過查找表放大圖像,例如應用彩色圖)。 – 2017-12-06 18:30:16