Python 获取两个不同维度numpy阵列之间所有唯一数字的最快方法

Python 获取两个不同维度numpy阵列之间所有唯一数字的最快方法,python,numpy,Python,Numpy,我有两个不同维度的numpy数组,我需要在它们之间获得所有唯一的int 由于它们的维数不同,我决定为它们中的每一个获取唯一的数字,将它们连接起来,然后获取唯一的值 初始方法 import numpy as np import time array1 = np.random.randint(1, high=5000, size=(512, 4) , dtype=np.int32) array2 = np.random.randint(1, high=5000, size=(512, 64) ,

我有两个不同维度的numpy数组,我需要在它们之间获得所有唯一的int

由于它们的维数不同,我决定为它们中的每一个获取唯一的数字,将它们连接起来,然后获取唯一的值

初始方法

import numpy as np
import time

array1 = np.random.randint(1, high=5000, size=(512, 4) , dtype=np.int32)
array2 = np.random.randint(1, high=5000, size=(512, 64) , dtype=np.int32)

start = time.time()
np.unique( np.concatenate( [np.unique(array1), np.unique(array2)] ) )
end = time.time()
print(end-start)
输出(5个平均值):

0.011

环境:谷歌Colab

有没有更快的办法


我的猜测是只执行一个np。唯一的操作,使用不同大小的numpy阵列来执行是一个挑战

np.hstack
将比您最初的方法稍快一点(尽管差异不大):


如果你的INT没有传播得太远,那么确实有一种更快的方法。为了简单起见,下面的代码假定为非负整数 小于5000

def use_mask():
    mask = np.zeros(5000,bool)
    mask[array1] = True
    mask[array2] = True
    return np.where(mask)

为了使这成为一个合适的函数,你必须找到数组1/2的最小值和最大值,取差值,如果它太大,则返回到其他值,否则从数组1/2中减去最小值,然后或多或少地像我一样进行操作。

在我的实际情况中,它将是从1到10的随机整数million@SantoshGupta7多大(#元素)真正的数组是吗?对于数组的数量,它们将是64到5000,对于这些数组的维度,它们将是132到50001024@SantoshGupta710000000个标签仍然可以使用这种方法。与
np.unique
相比,数组元素越多,速度越快。你得检查一下它是否能帮你加快速度。我的猜测是肯定的。请您更新代码中的数字以代表您向Paul建议的实际数据,好吗?在我的Mac电脑上,至少在串联的扁平阵列上运行
np.unique()
似乎更快
np.unique(np.concatenate((array1,array2,axis=None))
def use_mask():
    mask = np.zeros(5000,bool)
    mask[array1] = True
    mask[array2] = True
    return np.where(mask)