【问题标题】:How to find unique vectors of a 2d array over a particular axis in a vectorized manner?如何以向量化的方式在特定轴上找到二维数组的唯一向量?
【发布时间】:2023-03-04 22:41:01
【问题描述】:

我有一个形状数组(n,t),我想将其视为n-vectors 的时间序列。

我想知道沿 t-dimension 存在的唯一 n-vector 值以及每个唯一向量的关联 t-indices。我很乐意使用任何合理的平等定义(例如 numpy.unique 将采用浮点数)

使用t 上的 Python 循环很容易,但我希望采用矢量化方法。

在某些特殊情况下,可以通过将 n-vectors 折叠成标量(并在一维结果上使用 numpy.unique)来完成,例如如果您有布尔值,则可以使用带有 (2**k) 向量的向量化 dot 将(布尔向量)转换为整数,但我正在寻找一个相当通用的解决方案。

【问题讨论】:

    标签: python multidimensional-array numpy


    【解决方案1】:

    如果你的数组的形状是 (t, n)——所以每个 n 向量的数据在内存中是连续的——你可以将二维数组的视图创建为一维结构化数组,然后在这个视图上使用 numpy.unique。

    如果您可以更改数组的存储约定,或者如果您不介意制作转置数组的副本,那么这可能对您有用。

    这是一个例子:

    import numpy as np
    
    # Demo data.
    x = np.array([[1,2,3],
                  [2,0,0],
                  [1,2,3],
                  [3,2,2],
                  [2,0,0],
                  [2,1,2],
                  [3,2,1],
                  [2,0,0]])
    
    # View each row as a structure, with field names 'a', 'b' and 'c'.
    dt = np.dtype([('a', x.dtype), ('b', x.dtype), ('c', x.dtype)])
    y = x.view(dtype=dt).squeeze()
    
    # Now np.unique can be used.  See the `unique` docstring for
    # a description of the options.  You might not need `idx` or `inv`.
    u, idx, inv = np.unique(y, return_index=True, return_inverse=True)
    
    print("Unique vectors")
    print(u)
    

    【讨论】:

    • 这看起来很有希望,但对我来说不太适用。如果我使用 numpy 版本 1.6.2 运行示例代码(使用 dtype -> np.dtype),我会得到“TypeError:请求的排序不适用于类型”(见下文),当我尝试在我的实际问题中使用类似的逻辑时,我得到“ValueError:新类型与数组不兼容”(我正在尝试追踪,但这导致我按原样尝试示例)。
    • 由于某种原因,这些类型的对象没有实现 array.argsort(kind='mergesort')。 kind='quicksort' 工作正常。总的来说,我明白为什么它需要合并排序的稳定排序来处理索引中的重复/重复关系,但在我的情况下,我可以使用快速排序自己构建索引,而不用担心它会不稳定。不幸的是,我仍在尝试让 view(dtype=dt) 为我的实际数据工作。
    • 我的“新类型不兼容”错误是因为(正如你所暗示的)我需要说“xT = x.transpose().**copy()**”而不仅仅是“xT = x.转置()”。其次,在 numpy 1.6.2 中,当您要求它返回索引并且合并排序实现不喜欢自定义 dtypes 时,唯一使用合并排序(而不是快速排序)。为了解决这个问题,我可以制作自己的唯一副本(位于 arraysetops.py 中),它删除了 kind=mergesort。这解决了我的问题!有趣的是,对于 n
    • 很好地追踪排序方法问题。不幸的是,结构化数组无法使用“mergesort”方法进行排序似乎是一个不必要的限制(错误?)。
    • 原来这个问题已经在github上numpy的master分支中修复了。所以下一个版本的 numpy 应该允许使用 kind='mergesort' 对结构化数组进行排序,因此 unique 也应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 2017-07-25
    • 2018-05-23
    • 2021-12-12
    • 2020-05-05
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多