Python CuPy.unique()函数中是否有CuPy版本支持(axis)选项?有解决办法吗?

Python CuPy.unique()函数中是否有CuPy版本支持(axis)选项?有解决办法吗?,python,gpu,unique,axis,cupy,Python,Gpu,Unique,Axis,Cupy,我正在寻找支持axis选项的numpy.unique()的GPU CuPy对应项 我有一个Cupy2D数组,我需要删除它的重复行。不幸的是,cupy.unique()函数会展平数组并返回具有唯一值的1D数组。我正在寻找一个像numpy.unique(arr,axis=0)这样的函数来解决这个问题,但是CuPy还不支持(axis)选项 x=cp.array([[1,2,3,4],[4,5,6,7],[1,2,3,4],[10,11,12,13]) y=cp.unique(x) y_r=np.uni

我正在寻找支持axis选项的numpy.unique()的GPU CuPy对应项

我有一个Cupy2D数组,我需要删除它的重复行。不幸的是,cupy.unique()函数会展平数组并返回具有唯一值的1D数组。我正在寻找一个像numpy.unique(arr,axis=0)这样的函数来解决这个问题,但是CuPy还不支持(axis)选项

x=cp.array([[1,2,3,4],[4,5,6,7],[1,2,3,4],[10,11,12,13])
y=cp.unique(x)
y_r=np.unique(cp.asnumpy(x),轴=0)
打印('二维数组:\n',x)
打印('必需:\n',y\r',但使用CuPy')
打印('展平的唯一数组:\n',y)
打印('Error producting line:',cp.unique(x,axis=0))
我希望二维数组具有唯一的行,但我得到的是具有唯一数字的一维数组。关于如何用CuPy或numba实现这一点,有什么想法吗?

自CuPy版本
8.0.0b2
起,功能
CuPy.lexsort
已正确实现。此函数可作为带axis参数的
cupy.unique
的变通方法(尽管可能不是最有效的)

假设阵列是二维的,并且您希望沿轴0查找唯一的元素(否则根据需要进行转置/交换):


如果还想实现return\u stuff参数,请选中(基于此)。我自己不需要这些。

从CuPy版本
8.0.0b2
开始,功能
CuPy.lexsort
已正确实现。此函数可作为带axis参数的
cupy.unique
的变通方法(尽管可能不是最有效的)

假设阵列是二维的,并且您希望沿轴0查找唯一的元素(否则根据需要进行转置/交换):


如果还想实现return\u stuff参数,请选中(基于此)。我自己也不需要。

非常感谢您的回复。我不是在沿着特定轴寻找唯一的(元素),而是在寻找唯一的行或列,例如:如果x=[[01 2 3 4][01 2 3 4][10 11 12 13 14][15 16 17 18 19][20 21 22 23 24]],它必须返回:[[01 2 3 4][10 11 12 13 14][15 16 17 19][20 21 22 23 24]]这就是这个函数的作用,我的措辞可能会让人困惑。您可以用数组测试它:
x=cupy.arange(25)。重塑((5,5));x[1]=x[0];印刷品(x);打印(cupy_unique_axis0(x))
。这非常有用。我真的很感激。谢谢非常感谢您的回复。我不是在沿着特定轴寻找唯一的(元素),而是在寻找唯一的行或列,例如:如果x=[[01 2 3 4][01 2 3 4][10 11 12 13 14][15 16 17 18 19][20 21 22 23 24]],它必须返回:[[01 2 3 4][10 11 12 13 14][15 16 17 19][20 21 22 23 24]]这就是这个函数的作用,我的措辞可能会让人困惑。您可以用数组测试它:
x=cupy.arange(25)。重塑((5,5));x[1]=x[0];印刷品(x);打印(cupy_unique_axis0(x))
。这非常有用。我真的很感激。谢谢
    ###################################
    # replacement for numpy.unique with option axis=0
    ###################################

    def cupy_unique_axis0(array):
        if len(array.shape) != 2:
            raise ValueError("Input array must be 2D.")
        sortarr     = array[cupy.lexsort(array.T[::-1])]
        mask        = cupy.empty(array.shape[0], dtype=cupy.bool_)
        mask[0]     = True
        mask[1:]    = cupy.any(sortarr[1:] != sortarr[:-1], axis=1)
        return sortarr[mask]