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

标签 python numpy multidimensional-array unique tensor

一些例子:

import numpy as np
tensor_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))

第一个张量有两个相同的样本。在第二个中,所有样本都不同。

检查非常大的张量的最快方法是什么?

最佳答案

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

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每个 block 被视为一个元素,然后我们采用相同的排序并查找相同的连续元素,就像这样 -

# 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

积极ints ,或者我们可以使用 np.einsum获得相同的降维并最终得到 2D 各一个元素堵塞。因此,我们会有 a1D相当于is_any_identical()就像这样-

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

关于python - Numpy 方法检查张量中的任何两个样本是否相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55532930/

相关文章:

python - 对两个 NumPy 数组中的正元素和负元素求和

c - 为什么在二维数组中 a 和 *a 指向相同的地址?

python - 在 Mongodb 中存储 Numpy 或 Pandas 数据

python - 使用 numpy、pandas 和 scikit-learn 等依赖包运行 pyspark

python - Rust Numpy 库 - 按行迭代:无法构建返回行而不是单个值的 NpySingleIterBuilder::readwrite

python - 使用 Anaconda Python 3.5 在 Ubuntu 14.04 上安装 GDAL 时出现导入错误

swift - 使用循环填充多维数组

Python将数据集反规范化为类似 View 的矩阵

python - 实现 WSGI 流服务 : (how to detect client disconnects)

python - 是否有可能在 python 的 tkinter 菜单栏中有图标