对NumPy数组进行排序

3
我是一名有用的助手,可以为您进行翻译。以下是您需要翻译的内容:

我有一个np数组,它是通过以下方式构建两个其他数组的交集:

第一个数组是:

[['! ! !' '! ! ! !']
 ['! ! !' '! ! ! "']
 ['! ! !' '! ! ! .']
 ...,
 ['}' '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 sort中一样)。有没有办法将我的输出数组按照其他数组的方式进行排序?请注意,数组的形状很重要。

@Mr E arr1和arr2最初是列表。我无法给出精确的副本,但我会尽力构建一个例子来说明我需要什么。

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

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

理想情况下,输出应为:
[['! ! !' '! ! ! !']
 ['! ! !' '! ! ! "']
 ['! ! !' '! ! ! .']
 ['!' '!']
 ['}' 'was postponed']
 ['}' 'was']
 ['}' '{of']]

但实际上是这样的:
[['!' '!']
 ['! ! !' '! ! ! !']
 ['! ! !' '! ! ! "']
 ['! ! !' '! ! ! .']
 ['}' 'was postponed']
 ['}' 'was']
 ['}' '{of']]

或类似的东西。

2
你能提供Python代码arr1arr2,可以复制并粘贴到终端或编辑器中吗? - YXD
当然,只需提供一些代表性的东西,并且最好是您期望的输出。 - YXD
我编辑了我的问题。 - Bib
1个回答

1
我不太理解您输入的格式,但您可以根据自己的需要进行调整。问题是,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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接