Учитывая numpy Nx2 numpy массив data
целых (мы можем предположить, что data
не имеет повторяющихся строк), мне нужно сохранить только те строки, элементы которых удовлетворяют соотношению
(data[i,0] == data[j,1]) & (data[i,1] == data[j,0])
Например, с
import numpy as np
data = np.array([[1, 2],
[2, 1],
[7, 3],
[6, 6],
[5, 6]])
Я должен вернуть
array([[1, 2], # because 2,1 is present
[2, 1], # because 1,2 is present
[6, 6]]) # because 6,6 is present
Один многословный способ сделать это -
def filter_symmetric_pairs(data):
result = np.empty((0,2))
for i in range(len(data)):
for j in range(len(data)):
if (data[i,0] == data[j,1]) & (data[i,1] == data[j,0]):
result = np.vstack([result, data[i,:]])
return result
, и я придумал более краткий:
def filter_symmetric_pairs(data):
return data[[row.tolist() in data[:,::-1].tolist() for row in data]]
Может кто-нибудь предложить лучшую numpy идиому?