我有兩個 numpy 陣列“a”和“b”。
'a' 是形狀 [30000,2] 并包含成對的 x,y 坐標。'b' 的形狀為 [10,000,000,3] 并包含 x,y,z 坐標。
來自'a' 的x,y 坐標對在'b' 中總是出現一次(即唯一)。我想有效地從“b”中提取相應的 z 坐標。
這是一個簡單的例子......
a = np.array([[1,2], [3,4], [5,6], [8,9]]).T
b = np.array([[1,2,11], [1,3,12], [3,4,13], [4,5,14],[5,6,15], [6,7,16], [7,8,17], [8,9,18]]).T
將回傳[0,2,4,7]這樣的行索引z = [11, 13, 15, 18]
顯然,這可以通過 2 個 for 回圈來實作(YUCK !!!)
我敢肯定這是一個簡單的問題,但它讓我難住了......
實作這一目標的最有效方法是什么?(尤其是對于較大的資料集)
uj5u.com熱心網友回復:
您可以將 2D 陣列轉換為 1D 視圖(請參閱此答案),然后使用numpy.isin:
def view1D(a, b):
a = np.ascontiguousarray(a)
b = np.ascontiguousarray(b)
void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
return a.view(void_dt).ravel(), b.view(void_dt).ravel()
A,B = view1D(a.T, b[:2].T)
b.T[np.isin(B, A)][:,2]
# array([11, 13, 15, 18])
uj5u.com熱心網友回復:
如果您不想展平陣列,另一種選擇是使它們具有相同的大小并按元素進行比較:
a, b = a.T, b.T
tile_a = np.tile(a, b[: , :2].shape[0]).reshape(a.shape[0] * b[: , :2].shape[0], a.shape[1])
indices = np.argwhere((tile_a == np.concatenate([b[:, :2]]*a.shape[0])).all(axis=1))
indices[indices > 0] -= 1
print(np.squeeze(b[indices // a.shape[0]], axis=1)[:, 2])
#[11 13 15 18]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/420306.html
標籤:
上一篇:如果值不滿足Python中的特定計數,則創建重復值一定次數
下一篇:如何使用numpy創建一組亂數
