簡體   English   中英

在二維 numpy 數組中查找公共元素

[英]Find common elements in 2D numpy arrays

如果我有兩個(或更多)二維數組,我如何才能在給定行號的數組之間只獲取公共元素。 例如,我有以下格式的數組:

time, position, velocity, acceleration

我想讓兩個數組只有相同的時間元素,所以第 0 行。我可以使用

np.intersect1d(array1[:, 0], array2[:, 0])

這給出了所有常見的時間,但我想從 array1/2 中提取所有匹配的行/列或刪除不常見的時間元素。 最后array1array2將具有完全相同的尺寸,所以我可以去:

pos_difference = array1[:, 1] - array2[:, 1]

數組可以是不同的大小,例如:

array1 = [[1, 100.0, 0.0, 0.0], [2, 110.0, 0.0, 0.0], [3, 120.0, 0.0, 0.0]]
array2 = [[1, 101.0, 0.0, 0.0], [3, 119, 0.0, 0.0]]

而且我只想提取常見的時間元素,因此 array1 和 array2 將僅在 Time=1 和 Time=3 時包含,因為這些是常見的時間元素。 然后我可以去:

pos_difference = array1[:, 1] - array2[:, 1]

這將同時是兩個數組之間的位置差異:

# First row will be when time=1 and second row will be when time=3
pos_difference = [[0, -1, 0.0, 0.0], [0, 1, 0.0, 0.0]]

如果你有這些數組:

import numpy as np
array1 = np.array([[1, 100.0, 0.0, 0.0], [2, 110.0, 0.0, 0.0], [3, 120.0, 0.0, 0.0]])
array2 = np.array([[1, 101.0, 0.0, 0.0], [3, 119, 0.0, 0.0]])

正如您所說,您可以使用np.intersect1d來獲取交集,剩下的唯一事情就是索引數組:

intersect = np.intersect1d(array1[:, 0], array2[:, 0])

array1_matches = array1[np.any(array1[:, 0] == intersect[:, None], axis=0)]
array2_matches = array2[np.any(array2[:, 0] == intersect[:, None], axis=0)]

然后你可以減去它們:

>>> array1_matches - array2_matches
array([[ 0., -1.,  0.,  0.],
       [ 0.,  1.,  0.,  0.]])

這假設您的時間是唯一的且已排序。 如果它們未排序,您可以先對它們進行排序:

>>> array1 = array1[np.argsort(array1[:, 0])]
>>> array2 = array2[np.argsort(array2[:, 0])]

如果時間不是唯一的,我不知道你想如何處理,所以我不能在那里給你建議。

你想使用numpy.in1d

array1 = array1[np.in1d(array1[:,0], array2[:,0]), assume_unique=True]
array2 = array2[np.in1d(array2[:,0], array1[:,0]), assume_unique=True]

或者,如果您不想更改原件:

array3 = array1[np.in1d(array1[:,0], array2[:,0]), assume_unique=True]
array4 = array2[np.in1d(array2[:,0], array3[:,0]), assume_unique=True]

請注意,在這兩種情況下,我都使用縮減數組作為第二個in1d的目標以減少搜索時間。 如果您想進一步優化,您可以將其包裝在if語句中,以確保較小的數組是第一個in1d的目標。

然后只做array3-array4

def common_subtract(a1, a2, i = 0, unique = True):
    a1, a2 = np.array(a1), np.array(a2)
    if a1.shape[0] > a2.shape[0]:  
        a1 = a1[np.in1d(a1[:, i], a2[:, i], assume_unique = unique)]
        a2 = a2[np.in1d(a2[:, i], a1[:, i], assume_unique = unique)]
    else:
        a2 = a2[np.in1d(a2[:, i], a1[:, i], assume_unique = unique)]
        a1 = a1[np.in1d(a1[:, i], a2[:, i], assume_unique = unique)]
    return a1 - a2

我發現使用 intersect1d 更清晰地找到二維 numpy 數組中的常見元素。 在這種情況下,已定義了recent_bookscoding_books

start = time.time()
recent_coding_books = np.intersect1d([recent_books], [coding_books]) 
print(len(recent_coding_books))
print('Duration: {} seconds'.format(time.time() - start))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM