涉及行元素集合“字母排序”的问题

2024-09-20 03:43:20 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑变量<强> SETSimule< /强>(它可以取值2或3),一个NUMPY数组<强> v。 v中的列数可被setSize整除。以下是一个小样本:

import numpy as np

setSize = 2

# the array spaces are shown to emphasize that the rows 
# are made up of sets having, in this case, 2 elements each. 

v = np.array([[2,5,  3,5,  1,8],
              [4,6,  2,7,  5,9],
              [1,8,  2,3,  1,4],
              [2,8,  1,4,  3,5],
              [5,7,  2,3,  7,8],
              [1,2,  4,6,  3,5],
              [3,5,  2,8,  1,4]])

问题:对于所有元素都是唯一的行,我需要对集合进行字母排序。 例如:集合1,14将位于集合3,5之前,集合3,5将位于集合5,1之前。 作为最后一步,我需要消除可能产生的任何重复行

在上面的示例中,具有索引1、3、5和6的数组行具有唯一的元素, 所以这些行必须按字母顺序排列。其他行不会更改。 此外,按字母顺序排列后的行v[3]v[6]现在是相同的。其中一个可能会掉下来

最终输出如下所示:

v =          [[2,5,  3,5,  1,8],
              [2,7,  4,6,  5,9],
              [1,8,  2,3,  1,4],
              [1,4,  2,8,  3,5],
              [5,7,  2,3,  7,8],
              [1,2,  3,5,  4,6]]

我可以用下面的代码识别具有唯一元素的行,但我坚持使用字母顺序代码

s = np.sort(v,axis=1)
v[(s[:,:-1] != s[:,1:]).all(1)]

Tags: the代码importnumpy元素np字母数组
1条回答
网友
1楼 · 发布于 2024-09-20 03:43:20

假设您删除了不合适的行,请执行以下操作:

s = np.sort(v, axis=1)
idx = (s[:,:-1] != s[:,1:]).all(1)
w = v[idx]

然后,您可以使用np.lexsort在重新成形的数组上获取每一行的顺序:

w = w.reshape(-1,3,2)
s = np.lexsort((w[:,:,1], w[:,:,0]))

然后,您可以应用花式索引并重新调整其形状:

rows, orders = np.repeat(np.arange(len(s)), 3), s.flatten()
v[idx] = w[rows, orders].reshape((-1,6))

如果需要删除重复的行,可以这样做:

u, idx = np.unique(v, return_index=True, axis=0)
output = v[np.sort(idx)]

过程可视化:

enter image description here

样本运行:

>>> s
array([[1, 0, 2],
       [1, 0, 2],
       [0, 2, 1],
       [2, 1, 0]], dtype=int64)
>>> rows
array([0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3])
>>> orders
array([1, 0, 2, 1, 0, 2, 0, 2, 1, 2, 1, 0], dtype=int64)
>>> v[idx]
array([[2, 7, 4, 6, 5, 9],
       [1, 4, 2, 8, 3, 5],
       [1, 2, 3, 5, 4, 6],
       [1, 4, 2, 8, 3, 5]])
>>> v
array([[2, 5, 3, 5, 1, 8],
       [2, 7, 4, 6, 5, 9],
       [1, 8, 2, 3, 1, 4],
       [1, 4, 2, 8, 3, 5],
       [5, 7, 2, 3, 7, 8],
       [1, 2, 3, 5, 4, 6],
       [1, 4, 2, 8, 3, 5]])
>>> output
array([[2, 5, 3, 5, 1, 8],
       [2, 7, 4, 6, 5, 9],
       [1, 8, 2, 3, 1, 4],
       [1, 4, 2, 8, 3, 5],
       [5, 7, 2, 3, 7, 8],
       [1, 2, 3, 5, 4, 6]])

相关问题 更多 >