Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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_Python 3.x_Numpy - Fatal编程技术网

在python中查找近似无序数组的最佳方法是什么?

在python中查找近似无序数组的最佳方法是什么?,python,python-3.x,numpy,Python,Python 3.x,Numpy,您能帮助检测所有近似无序数组吗?例如,我有如下数组(a): a = np.array([[(1.000, 2.000, 1.000), (1.000, 3.000, 2.000), (4.000, 3.000, 1.000)], [(1.000, 3.000, 2.000), (4.000, 3.000, 1.000), (1.001, 2.000, 1.000)], [(4.000, 2.999, 1.001), (1.000, 2.000, 1.000), (1.000, 3.000, 2.

您能帮助检测所有近似无序数组吗?例如,我有如下数组(a):

a = np.array([[(1.000, 2.000, 1.000), (1.000, 3.000, 2.000), (4.000, 3.000, 1.000)],
[(1.000, 3.000, 2.000), (4.000, 3.000, 1.000), (1.001, 2.000, 1.000)],
[(4.000, 2.999, 1.001), (1.000, 2.000, 1.000), (1.000, 3.000, 2.000)],
[(5.000, 2.000, 2.000), (4.000, 3.000, 1.000), (2.000, 3.000, 1.000)]])
第二行和第三行几乎等于第一行,位置混乱,接受误差为0.001

输出:

[[[1.000    2.000    1.000] 
  [1.000    3.000    2.000]
  [4.000    3.000    1.000]]

 [[5.000    2.000    2.000] 
  [4.000    3.000    1.000]
  [2.000    3.000    1.000]]]


你的任务有两个要素:四舍五入和取单数

如果你想让两个数字的差值小于0.01时被认为是“相同的”,那就相当困难了。除其他外,这是非传递性的;A可以与B“接近”,B与C“接近”,而A与C“接近”。在数学术语中,这不是等价关系。因为“只取一组封闭列表中的一个”的另一种说法是“只取每个等价类中的一个成员”,所以这不是等价关系这一事实是一个问题

一个微妙的不同,但更可能的解释是,将你的问题陈述视为要求四舍五入到小数点后两位;这可以通过以下方式实现:

decimal_points = 2
rounded_tuples = [tuple(tuple(round(element, decimal_points) for element in inner_list)
                     for inner_list in outer_list)
                         for outer_list in a]
拿单子要困难得多。一种方法是将所有内容转换为其等价类的规范成员,然后获取所有此类成员的集合。这就是为什么我有上面的元组;获取集合需要不可变的数据结构,如元组

现在,与其说等价关系“紧密”,不如说是“排列不同”。 使用这种等价关系,获得规范成员的一种方法是对每个列表进行排序。但现在的问题是我们有列表的列表,所以我们必须对子列表进行排序。一个简单的排序是词汇排序:根据第一个元素排序,然后在每个具有相同第一个元素的列表中,根据第二个元素排序,等等

def sort_nested_tuple(nested_tuple):
    for i in range(len(nested_tuple[0])):
        nested_tuple = tuple(sorted(nested_tuple, key = lambda x: x[i]))
    return nested_tuple
sorted_tuples = [sort_nested_tuple(outer_tuple) 
                    for outer_tuple in rounded_tuples]
在这里,我将遍历每个元素并按其排序。由于最后一个元素用作最后一个键,因此它将覆盖所有以前的键。只有当两个列表具有相同的最后一个元素时,才会保留从第二个元素到最后一个元素的顺序。所以这可以被认为是“小端”的词法顺序,但只要它是一致的,什么顺序并不重要

现在我们只需要获取结果元组的集合:

uniques = set(sorted_tuples)    
这将生成一组元组,而不是numpy对象,但如果需要,可以将其转换回去。另外,您得到的是规范列表,它可能不是任何原始列表,因此如果您想得到一个由原始输入中出现的列表组成的结果,您必须为此做更多的工作。有点暴力的方法是:

unique_originals = []
for unique in uniques:
    for original, sorted_tuple in zip(a, sorted_tuples):
        if sorted_tuple == unique:
            unique_originals.append(original)
            break

我将从舍入开始:
np.round(a,2)
。不确定如何继续。这可能会有所帮助:亲爱的先生,我不太确定,但我得到了一个错误“ValueError:包含多个元素的数组的真值不明确。请使用a.any()或a.all()。请帮帮我@BinhThien我已经改变了最后一点,所以它现在应该可以工作了。