Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何以矢量化的方式找到特定轴上二维阵列的唯一矢量?_Python_Multidimensional Array_Numpy - Fatal编程技术网

Python 如何以矢量化的方式找到特定轴上二维阵列的唯一矢量?

Python 如何以矢量化的方式找到特定轴上二维阵列的唯一矢量?,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)向量将(布尔向量)转换为整数,但我正在寻找一个相当通用的解决方案。如果数组的形状是

我有一个shape
(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
也应该可以工作。