从NumPy 2D阵列中删除重复的列和行

Ser*_*rgi 20 python numpy duplicate-removal scipy

我正在使用2D形状阵列来存储经度+纬度对.有一次,我必须合并其中两个2D数组,然后删除任何重复的条目.我一直在寻找类似于numpy.unique的功能,但我没有运气.我一直在考虑的任何实现都看起来非常"未经优化".例如,我正在尝试将数组转换为元组列表,删除带有set的重复项,然后再次转换为数组:

coordskeys = np.array(list(set([tuple(x) for x in coordskeys])))
Run Code Online (Sandbox Code Playgroud)

有没有现成的解决方案,所以我不重新发明轮子?

为了说清楚,我正在寻找:

>>> a = np.array([[1, 1], [2, 3], [1, 1], [5, 4], [2, 3]])
>>> unique_rows(a)
array([[1, 1], [2, 3],[5, 4]])
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我想只使用一个元组列表,但是这些列表非常大,以至于它们消耗了我的4Gb RAM + 4Gb交换(numpy数组更节省内存).

use*_*424 31

这应该做的伎俩:

def unique_rows(a):
    a = np.ascontiguousarray(a)
    unique_a = np.unique(a.view([('', a.dtype)]*a.shape[1]))
    return unique_a.view(a.dtype).reshape((unique_a.shape[0], a.shape[1]))
Run Code Online (Sandbox Code Playgroud)

例:

>>> a = np.array([[1, 1], [2, 3], [1, 1], [5, 4], [2, 3]])
>>> unique_rows(a)
array([[1, 1],
       [2, 3],
       [5, 4]])
Run Code Online (Sandbox Code Playgroud)


Bi *_*ico 17

这是一个想法,它需要一些工作,但可能会非常快.我会给你1d案例,让你弄清楚如何将它扩展到2d.以下函数查找1d数组的唯一元素:

import numpy as np
def unique(a):
    a = np.sort(a)
    b = np.diff(a)
    b = np.r_[1, b]
    return a[b != 0]
Run Code Online (Sandbox Code Playgroud)

现在将它扩展到2d你需要改变两件事.您将需要弄清楚如何自己进行排序,关于排序的重要事情是两个相同的条目最终彼此相邻.其次,你需要做一些事情,比如(b != 0).all(axis)因为你想比较整个行/列.让我知道这是否足以让你开始.

更新:在doug的一些帮助下,我认为这应该适用于2d案例.

import numpy as np
def unique(a):
    order = np.lexsort(a.T)
    a = a[order]
    diff = np.diff(a, axis=0)
    ui = np.ones(len(a), 'bool')
    ui[1:] = (diff != 0).any(axis=1) 
    return a[ui]
Run Code Online (Sandbox Code Playgroud)


小智 5

我的方法是将2d数组转换为1d复数数组,其中实部为第1列,虚部为第2列.然后使用np.unique.虽然这只适用于2列.

import numpy as np 
def unique2d(a):
    x, y = a.T
    b = x + y*1.0j 
    idx = np.unique(b,return_index=True)[1]
    return a[idx] 
Run Code Online (Sandbox Code Playgroud)

示例 -

a = np.array([[1, 1], [2, 3], [1, 1], [5, 4], [2, 3]])
unique2d(a)
array([[1, 1],
       [2, 3],
       [5, 4]])
Run Code Online (Sandbox Code Playgroud)