簡體   English   中英

Numpy - 在多個坐標中找到匹配

[英]Numpy - Finding matches across multiple co-ordinates

我正在使用somoclu來生成一些數據的緊急自組織映射。 一旦我擁有BMU(最佳匹配單位),我就在BMU的坐標上執行Delaunay三角測量,以便在SOM中找到每個BMU的鄰居。

在下面的Python片段中,是否有更多的Pythonic版本的a == c and b == d條件? 換句話說,如何在不拆分單獨的坐標的情況下直接比較bmupoint

points = np.unique(np.array(som.bmus), axis = 0)
for idx, bmu in enumerate(som.bmus):
    a, b = bmu
    for point_idx, point in enumerate(points):
        c, d = point
        if a == c and b == d: # More Pythonic version of this line?
            print (idx, point_idx)
            break

方法#1

我們正在使用NumPy陣列,因此我們可以利用broadcasting來實現矢量化解決方案 -

ar = np.array(som.bmus)
points = np.unique(ar, axis = 0)

mask = (ar[:,0,None]==points[:,0]) & (ar[:,1,None]==points[:,1])
indices = np.argwhere(mask)

方法#1-G

一個更緊湊的方式獲得mask ,覆蓋通用號碼。 ar的列將是 -

mask = (ar[:,None] == points).all(axis=2)

方法#2

通用號碼的另一種節省內存的方法。 cols將與viewsnp.searchsorted -

# https://stackoverflow.com/a/45313353/ @Divakar
def view1D(a, b): # a, b are arrays
    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()

n = len(ar)
indices = np.empty((n,2),dtype=int)
indices[:,0] = np.arange(n)
a,b = view1D(ar, points) # ar, points from app#1
indices[:,1] = np.searchsorted(b, a)

使用numpy數組,您可以使用np.array_equal 這測試相同的形狀和相同的元素。

但如果您的邏輯與您擁有的代碼一樣簡單,請使用@Divakar的矢量化解決方案

points = np.unique(np.array(som.bmus), axis = 0)

for idx, bmu in enumerate(som.bmus):
    for point_idx, point in enumerate(points):
        if np.array_equal(bmu, point):
            print(idx, point_idx)
            break

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM