[英]Numpy - Finding matches across multiple co-ordinates
我正在使用somoclu
來生成一些數據的緊急自組織映射。 一旦我擁有BMU(最佳匹配單位),我就在BMU的坐標上執行Delaunay三角測量,以便在SOM中找到每個BMU的鄰居。
在下面的Python片段中,是否有更多的Pythonic版本的a == c and b == d
條件? 換句話說,如何在不拆分單獨的坐標的情況下直接比較bmu
和point
?
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將與views
和np.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.