[英]Find the set difference between two large arrays (matrices) in Python
[英]Python : find difference between two arrays in python
我在 python 中有兩個數組。
arr1 = [(7, 0.78, 7920), (8, 0.9, 9000)]
arr2 = [(7, 1.68, 8460)]
在這個數組中,第一個值是ID
(7,8,7)。我想要基於ID
結果。 如果 ID 相同,則獲得其他兩個值之間的差異。
arr1
和arr2
ID 7 相同,則減去 (1.68-0.78 = 0.9) 和 (8460-7920 = 540) 否則將相同。 如何得到這樣的結果?
diffArray = [(7, 0.9, 540), (8, 0.9, 9000)]
這是一種方法。 首先,我正在創建從 ID 到其他值的字典:
arr1 = [(7, 0.78, 7920), (8, 0.9, 9000)]
arr2 = [(7, 1.68, 8460)]
dict1 = {i: (x, y) for i, x, y in arr1}
dict2 = {i: (x, y) for i, x, y in arr2}
然后我使用帶有條件的列表理解來做正確的事情:
diffArray = [
(
i,
abs(dict2[i][0] - dict1[i][0]),
abs(dict2[i][1] - dict1[i][1]),
)
if i in dict2
else (i, dict1[i][0], dict1[i][1])
for i in dict1
]
結果可能有點出人意料:
[(7, 0.8999999999999999, 540), (8, 0.9, 9000)]
明顯的不精確是由於浮點表示。 為了解決這個問題(如果它很重要),請使用Decimal
或舍入這些值。
這將遍歷 arr2 中的每個元素,然后將其添加到 arr1 的正確索引中。 如果它不存在,那么它會以新鮮的方式添加它
arr1 = [(7, 0.78, 7920), (8, 0.9, 9000)]
arr2 = [(7, 1.68, 8460), (6,1,1)]
for j in arr2:
for ix, i in enumerate(arr1):
if i[0] == j[0]:
arr1[ix] = (i[0], j[1]-i[1], j[2]-i[2])
break
else:
arr1.append(j)
arr1
[(7, 0.8999999999999999, 540), (8, 0.9, 9000), (7, 1.68, 8460), (6, 1, 1)]
arr1 = [(7, 0.78, 7920), (8, 0.9, 9000)]
arr2 = [(7, 1.68, 8460)]
arr1.sort(key=lambda x:x[0])
arr2.sort(key=lambda x:x[0])
from itertools import zip_longest
new_list = []
for value1, value2 in zip_longest(arr1, arr2):
if value2:
_id1, val3, val4 = value1
_id2, val5, val6 = value2
if _id1 == _id2:
diff1 = val5 - val3
diff2 = val6 - val4
new_list.append((_id1, diff1, diff2))
else:
new_list.append(value1)
print(new_list)
>>>[(7, 0.8999999999999999, 540), (8, 0.9, 9000)]
這是我的嘗試,使用兩個列表推導式:
arr1 = [(7, 0.78, 7920), (8, 0.9, 9000)]
arr2 = [(7, 1.68, 8460)]
common = [tuple([a[0], b[1] - a[1], b[2] - a[2]]) for a in arr1 for b in arr2 if a[0]==b[0]]
others = [a for a in arr1 for b in arr2 if a[0]!=b[0]]
result = common + others
輸出:
[(7, 0.8999999999999999, 540), (8, 0.9, 9000)]
這是一種方法。
def diffArrays(arr1, arr2):
"""
Parameters
----------
arr1 : array
firt array.
arr2 : array
second array to be compared with.
Returns
-------
arr3: array
array containing only the different elements.
"""
arr3 = []
[arr3.append(el) if el not in arr2 else '' for el in arr1]
[arr3.append(el) if el not in arr1 else '' for el in arr2]
return arr3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.