Numpy - 在多个坐标中找到匹配

时间:2018-04-09 10:33:52

标签: python numpy self-organizing-maps

我正在使用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

2 个答案:

答案 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将与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)

答案 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