在python中查找近似无序数组的最佳方法是什么?
您能帮助检测所有近似无序数组吗?例如,我有如下数组(a):在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 = 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我已经改变了最后一点,所以它现在应该可以工作了。