我正在使用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
答案 0 :(得分:2)
方法#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)
答案 1 :(得分:1)
使用numpy
数组,您可以使用np.array_equal
。这将测试相同的形状和相同的元素。
但如果您的逻辑与您拥有的代码一样简单,请使用@Divakar's vectorized solution。
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