python - 对 NumPy 数组进行排序

标签 python arrays sorting numpy

我有一个 np 数组,它按以下方式构造为 2 个其他数组的交集:

第一个数组是:

[['! ! !' '! ! ! !']
 ['! ! !' '! ! ! "']
 ['! ! !' '! ! ! .']
 ...,
 ['}' 'was postponed']
 ['}' 'was']
 ['}' '{of']]

第二个数组是:

[['! ! !' '! ! ! !']
 ['! ! !' '! ! ! "']
 ['! ! !' '! ! ! .']
 ...,
 ['}' 'was postponed']
 ['}' 'was']
 ['}' '{of']]

这两个数组其实有很多不同之处,但主要出现在中间几行。

用于构造交集的代码是:

def multidim_intersect(arr1, arr2):
    arr1_view = arr1.view([('',arr1.dtype)]*arr1.shape[1])
    arr2_view = arr2.view([('',arr2.dtype)]*arr2.shape[1])
    intersected = np.intersect1d(arr1_view, arr2_view)
    return intersected.view(arr1.dtype).reshape(-1, arr1.shape[1])

输出的数组是:

[['!' '!']
 ['!' '! !']
 ['!' '! ! !']
 ...,
 ['}' 'was']
 ['}' 'was postponed']
 ['}' '{of']]

如您所见,我的新数组的排序方式与原来的两个数组不同(这两个数组有多个感叹号排序在单个感叹号之前,就像在 LC_ALL=C 排序中所做的那样)。有没有办法像我的其他数组一样对我的输出数组进行排序?请注意,数组的形状很重要。

@Mr E arr1 和 arr2 最初是列表。我不能给你确切的副本,但我会尽力构建一个示例来说明我的需要。

arr1 = [['! ! !' '! ! ! !']
 ['! ! !' '! ! ! "']
 ['! ! !' '! ! ! .']
 ['!' '!']
 ['}' 'was postponed']
 ['}' 'was']
 ['}' '{of']]

arr2 = [['! ! !' '! ! ! !']
 ['! ! !' '! ! ! "']
 ['! ! !' '! ! ! .']
 ['!' '!']
 ['}' 'was postponed']
 ['}' 'was']
 ['}' '{of']]

理想情况下,输出将是:

[['! ! !' '! ! ! !']
 ['! ! !' '! ! ! "']
 ['! ! !' '! ! ! .']
 ['!' '!']
 ['}' 'was postponed']
 ['}' 'was']
 ['}' '{of']]

但它是:

[['!' '!']
 ['! ! !' '! ! ! !']
 ['! ! !' '! ! ! "']
 ['! ! !' '! ! ! .']
 ['}' 'was postponed']
 ['}' 'was']
 ['}' '{of']]

或类似的东西。

最佳答案

我不太了解您输入的格式,但您可以根据自己的需要进行调整。

问题是 numpy.intersect1d() 出于某种原因自动对输出进行排序。幸运的是,使用 numpy.in1d() 编写自己的交集函数并不难。你可以这样做:

import numpy as np

arr1 = np.array([['! ! !' '! ! ! !'],
 ['! ! !' '! ! ! "'],
 ['! ! !' '! ! ! .'],
 ['!' '!'],
 ['a' 'ad'],   # Stuff you don't want to get back
 ['}' 'was postponed'],
 ['}' 'was'],
 ['}' '{of']])

arr2 = np.array([['! ! !' '! ! ! !'],
 ['! ! !' '! ! ! "'],
 ['! ! !' '! ! ! .'],
 ['!' '!'],
 ['b' 'ab'],   # Stuff you don't want to get back
 ['}' 'was postponed'],
 ['}' 'was'],
 ['}' '{of']])

inarr = np.in1d(arr1, arr2)

arr3 = np.empty( shape=(0, 0) )

for i in np.arange(len(arr1)):
  if (inarr[i]):
    arr3 = np.append(arr3,arr1[i])

for i in np.arange(len(arr3)):
  print(arr3[i])

输出:

! ! !! ! ! !
! ! !! ! ! "
! ! !! ! ! .
!!
}was postponed
}was
}{of

关于python - 对 NumPy 数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26910224/

相关文章:

python - 尝试从 bash 运行 Python 脚本时出现奇怪的 HTML 文档类型错误

python - 抓取一个非常典型的文本 block

java - Java 将字节数组转换为字符串

来自两个数组的 Python linspace 限制

c# - collectionviewsource 中的特定排序分组项目

Java 按唯一索引号对值进行排序

python - 比较两个 Pandas 数据框的差异

Python:错误处理递归函数错误

php - mysql 查询以数组作为 WHERE 参数

c++ - 排序相关算法(用排序集合中的索引替换每个项目)