如何x用兩列(要替換的鍵 值)查找表(另一個 np.array)替換2D(或 3D)np.array 中的所有值lookup?
x = np.array([[0., 1., 5., 2.],
[5., 1., 3., 5.],
[4., 1., 1., 2.],
[0., 1., 3., 2.],
[2., 4., 1., 0.]])
x也可能是 3D 的,形狀或多或少是任意的。
lookup = np.array([[0, 1.2],
[1, 3.4],
[2, 0.1],
[3, 2.1],
[4, 5.4],
[5, 2.2]])
結果:
>>> x
array([[1.2, 3.4, 2.2, 0.1],
[2.2, 3.4, 2. , 2.2],
[5.4, 3.4, 3.4, 0.1],
[1.2, 3.4, 2. , 0.1],
[0.1, 5.4, 3.4, 1.2]])
獎勵:通常所有值x都表示在 的第一列中lookup。如何最好地處理x中未表示的值lookup,例如通過忽略它們被替換或將它們設定為 nan。
到目前為止,一種效率較低的方法(僅適用于 2D,但可能很容易被用于 3D):遍歷 in 中的所有元素x并將其與lookup.
def replaceByLookup(x, lookup):
for i in range(x.shape[0]):
for j in range(x.shape[1]):
for k in range(lookup.shape[0]):
if x[i,j] == lookup[k,0]:
x[i,j] = lookup[k,1]
break
我正在尋找一種更高效、或許更簡單的解決方案。我想知道numpy中是否沒有矢量化解決方案。如果該函式不能通過參考作業但回傳一個帶有替換值的新陣列,那也完全沒問題。
uj5u.com熱心網友回復:
您可以使用np.searchsorted在 中有效地定位關聯鍵的行lookup。然后,您可以通過簡單的直接索引輕松獲取關聯值。這是一個例子:
lookup[np.searchsorted(lookup[:,0], x),1]
請注意,這需要密鑰存在并按lookup密鑰排序。此外,您應該小心浮點數字鍵,因為它們與鍵略有不同。解決此問題的一種解決方案是對值進行四舍五入。此外,lookup陣列不應包含np.nan鍵中的特殊值(也就是說,它們可以單獨支持)。
獎勵答案:
np.searchsorted搜索應插入元素以保持順序的索引。如果該值不存在,則該函式回傳搜索陣列中的下一個最大項。您可以檢查鍵是否與搜索的鍵匹配,以了解查找是否成功。話雖如此,您需要確保索引實際上是有效的。這樣做有點麻煩。這是生成的代碼:
idx = np.searchsorted(lookup[:,0], x)
corrected_idx = np.minimum(idx, len(lookup)-1)
is_valid = lookup[corrected_idx, 0] == x
x[~is_valid] = np.nan
uj5u.com熱心網友回復:
您不能使用 python 字典代替查找陣列,因為這是進行查找的最有效方法,比每次迭代都在陣列中搜索要好得多。
首先將查找陣列轉換為 python 字典然后從該字典中分配是非常值得的。這將是非常簡單的代碼,不需要搜索或搜索迭代,并且會提供字典真正有效的隨機訪問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/433837.html
