Python 如何以矢量化的方式找到特定轴上二维阵列的唯一矢量?
我有一个shapePython 如何以矢量化的方式找到特定轴上二维阵列的唯一矢量?,python,multidimensional-array,numpy,Python,Multidimensional Array,Numpy,我有一个shape(n,t)数组,我想将其视为n向量的时间序列 我想知道沿t维存在的唯一n向量值,以及每个唯一向量的相关t指数。我很乐意使用任何合理的平等定义(例如,numpy.unique将采用浮动) 在t上进行Python循环很容易,但我希望采用矢量化方法 在某些特殊情况下,可以通过将n-向量折叠成标量(并在1d结果上使用numpy.unique)来实现,例如,如果您有布尔值,则可以使用向量化的点和(2**k)向量将(布尔向量)转换为整数,但我正在寻找一个相当通用的解决方案。如果数组的形状是
(n,t)
数组,我想将其视为n向量的时间序列
我想知道沿t维存在的唯一n向量
值,以及每个唯一向量的相关t指数
。我很乐意使用任何合理的平等定义(例如,numpy.unique
将采用浮动)
在t
上进行Python循环很容易,但我希望采用矢量化方法
在某些特殊情况下,可以通过将n-向量
折叠成标量(并在1d结果上使用numpy.unique
)来实现,例如,如果您有布尔值,则可以使用向量化的点
和(2**k)
向量将(布尔向量)转换为整数,但我正在寻找一个相当通用的解决方案。如果数组的形状是(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:requested sort not available for type”(见下文),当我尝试在实际问题中使用类似的逻辑时,我会得到“ValueError:new type not compatible with array”(我正在尝试跟踪该代码,但这导致我按原样尝试该示例)由于某些原因,这些类型的对象未实现array.argsort(kind='mergesort')。“快速排序”很好用。总的来说,我明白为什么它希望mergesort的稳定排序能够处理索引中带有重复项的关系,但在我的例子中,我可以自己使用快速排序构建索引,而不必担心它不稳定。不幸的是,我仍在尝试让视图(dtype=dt)用于我的实际数据。我的“新类型不兼容”错误是因为(正如您所提到的)我需要说“xT=x.transpose().*copy()**”,而不仅仅是“xT=x.transpose()”。其次,在numpy 1.6.2中,当您要求unique返回索引时,unique使用mergesort(而不是quicksort),并且mergesort实现不喜欢自定义数据类型。为了解决这个问题,我可以制作自己的unique副本(它位于arraysetops.py中),删除kind=mergesort。这解决了我的问题!有趣的是,对于NNIE工作,跟踪排序方法问题。不幸的是,结构化数组不能用“mergesort”方法进行排序似乎是一个不必要的限制(bug?)。事实证明,这已经在github上numpy的主分支中得到了修复。因此,numpy的下一个版本应该允许使用kind='mergesort'对结构化数组进行排序,因此unique
也应该可以工作。