Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 涉及';字母顺序';行元素集的集合_Python_Arrays_Numpy - Fatal编程技术网

Python 涉及';字母顺序';行元素集的集合

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],

考虑一个变量setSize(它可以取值2或3)和一个numpy数组vv中的列数可被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)]

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

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的新手,所以我很欣赏详细的描述。