Python 涉及';字母顺序';行元素集的集合
考虑一个变量setSize(它可以取值2或3)和一个numpy数组v。 v中的列数可被setSize整除。以下是一个小样本:Python 涉及';字母顺序';行元素集的集合,python,arrays,numpy,Python,Arrays,Numpy,考虑一个变量setSize(它可以取值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],
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)]
假设您删除了不合适的行,请执行以下操作:
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)]
过程可视化:
样本运行:
>>> 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]])
你看了吗?这已经很近了!两点:a)您的代码正确地按字母顺序排列了具有所有唯一值(索引1、3、5、6)的数组行,但问题是“其他行未更改”。所以我们需要保留行(索引0,2,4)。b) X应该是v。你能建议一个点a的修正吗?@user109387捕捉得好。所以我做了这些化妆品,看看。我是lexsort的新手,所以我很欣赏详细的描述。