Python 在每行中查找唯一值

Python 在每行中查找唯一值,python,numpy,numpy-ndarray,Python,Numpy,Numpy Ndarray,我有一个字符串大小为2的数组,希望在每一行中获得唯一的字符串 np.__version__ # '1.19.2' arr = np.array([['Z7', 'Q4', 'Q4'], # 2 unique strings ['Q4', 'Z7', 'Q4'], # 2 unq strings ['Q4', 'Z7', 'Z7'], # 2 unq strings ['Z7', 'Z7', 'Q4']

我有一个字符串大小为2的数组,希望在每一行中获得唯一的字符串

np.__version__
# '1.19.2'
arr = np.array([['Z7', 'Q4', 'Q4'], # 2 unique strings
                ['Q4', 'Z7', 'Q4'], # 2 unq strings
                ['Q4', 'Z7', 'Z7'], # 2 unq strings
                ['Z7', 'Z7', 'Q4'], # 2 unq strings
                ['D8', 'D8', 'L1'], # 2 unq strings
                ['L1', 'L1', 'D8']], dtype='<U2') # 2 unq strings

我无法理解到底发生了什么以及它返回这个精确输出的原因。

这是因为numpy.unique会展平行或列子阵列,然后返回唯一的行轴=0或列轴=1,而不是唯一值本身。看看这个例子:

a = np.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]])
np.unique(a, axis=0)
输出为:

array([[1, 0, 0], [2, 3, 4]])
array([[0, 1],
       [0, 1],
       [4, 2]])

输出为:

array([[1, 0, 0], [2, 3, 4]])
array([[0, 1],
       [0, 1],
       [4, 2]])

在您的情况下,您需要每行本身的唯一值,因此应该像您已经实现的那样应用“沿_轴”命令。轴=1没有多大作用,因为列都是唯一的,只显示一些排序。

这是因为numpy.unique展平行或列子数组,然后返回唯一的行轴=0或列轴=1,而不是唯一值本身。看看这个例子:

a = np.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]])
np.unique(a, axis=0)
输出为:

array([[1, 0, 0], [2, 3, 4]])
array([[0, 1],
       [0, 1],
       [4, 2]])

输出为:

array([[1, 0, 0], [2, 3, 4]])
array([[0, 1],
       [0, 1],
       [4, 2]])
在您的情况下,您需要每行本身的唯一值,因此应该像您已经实现的那样应用“沿_轴”命令。axis=1没有多大作用,因为您的列都是唯一的,只显示一些排序。

在axis参数的描述中,np.unique的文档, 包含以下语句:

。。。由给定轴索引的子阵列将被展平处理为一维阵列的元素

因此,如果调用np.unique,传递轴=1,则:

每列都是扁平的,因为每列都包含原子元素 价值观,什么都不会发生。 对结果列表执行唯一元素的查找 列的列表。如果两列完全相同,则仅 其中一个会被保留下来。 结果可能以改变的顺序呈现,如下所示 内部实现细节。 解释一下为什么每列不是行:轴1实际上是列

要确认在这种情况下,每个列都是processe对象, 将源阵列定义为:

arr_2 = np.array([['Z7', 'Q4', 'Q4', 'Q4'],
                  ['Q4', 'Z7', 'Q4', 'Q4'],
                  ['Q4', 'Z7', 'Z7', 'Z7'],
                  ['Z7', 'Z7', 'Q4', 'Q4'],
                  ['D8', 'D8', 'L1', 'L1'],
                  ['L1', 'L1', 'D8', 'D8']])
其中最后两列完全相同

当执行np.uniquearr_2,axis=1时,结果将 一模一样。最后两列完全相同, 因此其中一个已被删除。

np.unique的文档,在轴参数的描述中, 包含以下语句:

。。。由给定轴索引的子阵列将被展平处理为一维阵列的元素

因此,如果调用np.unique,传递轴=1,则:

每列都是扁平的,因为每列都包含原子元素 价值观,什么都不会发生。 对结果列表执行唯一元素的查找 列的列表。如果两列完全相同,则仅 其中一个会被保留下来。 结果可能以改变的顺序呈现,如下所示 内部实现细节。 解释一下为什么每列不是行:轴1实际上是列

要确认在这种情况下,每个列都是processe对象, 将源阵列定义为:

arr_2 = np.array([['Z7', 'Q4', 'Q4', 'Q4'],
                  ['Q4', 'Z7', 'Q4', 'Q4'],
                  ['Q4', 'Z7', 'Z7', 'Z7'],
                  ['Z7', 'Z7', 'Q4', 'Q4'],
                  ['D8', 'D8', 'L1', 'L1'],
                  ['L1', 'L1', 'D8', 'D8']])
其中最后两列完全相同

当执行np.uniquearr_2,axis=1时,结果将 一模一样。最后两列完全相同,
所以其中一个被淘汰了。

谢谢。现在我可以理解np.uniquearr,axis=1给出的输出,有没有比np更好的方法。沿_轴应用_?我真的不知道为什么你会想要一个不同的解决方案,因为它非常好用?np.apply_沿_轴很慢,它只是引擎盖下的一个for循环,不是矢量化的。非常感谢。现在我可以理解np.uniquearr,axis=1给出的输出,有没有比np更好的方法。沿_轴应用_?我真的不知道为什么你会想要一个不同的解决方案,因为它非常好用?np.apply_沿_轴很慢,它只是引擎盖下的一个for循环,不是矢量化的。你的解释使我明白了。非常感谢。有没有比np更好的方法。沿着轴应用?我想,没有比沿着轴应用更好的方法了。你的解释让我明白了。非常感谢。有没有比np更好的方法?沿着轴应用?我认为,没有比沿着轴应用更好的方法了。