为了账号安全,请及时绑定邮箱和手机立即绑定

检查张量中任意两个样本是否相同的 Numpy 方法

检查张量中任意两个样本是否相同的 Numpy 方法

慕婉清6462132 2021-12-29 20:28:42
一些例子:import numpy as nptensor_same = np.array([[1]*10 + [2] * 10 + [1] * 10]).reshape((-1, 10, 1))tensor_diff = np.array([[1]*10 + [2] * 10 + [1] * 9 + [2]]).reshape((-1, 10, 1))第一个张量有两个相同的样本。第二,所有样本都不同。检查非常大的张量的最快方法是什么?
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

我们可以np.unique沿着第一个轴使用来获得唯一数量的块,如果它与原始输入中的元素数量相同,则表示所有不同的样本,否则至少有一个重复,如下所示 -


In [25]: len(np.unique(tensor_same,axis=0)) != len(tensor_same)

Out[25]: True


In [26]: len(np.unique(tensor_diff,axis=0)) != len(tensor_diff)

Out[26]: False

另一种方法是使用返回的计数np.unique-


In [42]: (np.unique(tensor_same,axis=0, return_counts=1)[1]>1).any()

Out[42]: True


In [43]: (np.unique(tensor_diff,axis=0, return_counts=1)[1]>1).any()

Out[43]: False

另一种方法是沿第一个轴排序,执行连续元素微分,然后沿第二个轴查找所有零并最终ANY匹配 -


In [29]: (np.diff(np.sort(tensor_same,axis=0),axis=0)==0).all(1).any()

Out[29]: True


In [30]: (np.diff(np.sort(tensor_diff,axis=0),axis=0)==0).all(1).any()

Out[30]: False

另一种方法是使用views这样的方式,每个2D块都被视为一个元素,然后我们采用相同的排序并寻找相同的连续元素,就像这样 -


# https://stackoverflow.com/a/44999009/ @Divakar

def view1D(a): # a is array

    a = np.ascontiguousarray(a)

    void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))

    return a.view(void_dt).ravel()


def is_any_identical(a):

    a1D = view1D(a.reshape(a.shape[0],-1))

    a1Ds = np.sort(a1D)

    return (a1Ds[:-1] == a1Ds[1:]).any()

样品运行 -


In [90]: np.random.seed(0)

    ...: a = np.random.randint(11,99,(6,4,3))


In [91]: is_any_identical(a)

Out[91]: False


In [92]: a[2] = a[1] # force one identical element


In [93]: is_any_identical(a)

Out[93]: True

对于 positive ints,或者我们可以使用np.einsum来获得相同的降维,并最终得到一个元素用于一个2D块。因此,我们会有这样的a1D等价物is_any_identical()-


a1D = np.einsum('ijk,jk->i',a,a.max(0)+1)


查看完整回答
反对 回复 2021-12-29
  • 1 回答
  • 0 关注
  • 249 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号