gpt4 book ai didi

python - 如何删除 numpy 数组中的非对称对?

转载 作者:行者123 更新时间:2023-12-02 05:12:26 25 4
gpt4 key购买 nike

给定一个 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 习语吗?

最佳答案

您可以使用以下几种不同的方法来执行此操作。第一个是“明显的”二次解,它很简单,但如果您有一个很大的输入数组,可能会给您带来麻烦。只要输入中没有大范围的数字,第二个就应该可以工作,并且它具有使用线性内存量的优点。

import numpy as np

# Input data
data = np.array([[1, 2],
[2, 1],
[7, 3],
[6, 6],
[5, 6]])

# Method 1 (quadratic memory)
d0, d1 = data[:, 0, np.newaxis], data[:, 1]
# Compare all values in first column to all values in second column
c = d0 == d1
# Find where comparison matches both ways
c &= c.T
# Get matching elements
res = data[c.any(0)]
print(res)
# [[1 2]
# [2 1]
# [6 6]]

# Method 2 (linear memory)
# Convert pairs into single values
# (assumes positive values, otherwise shift first)
n = data.max() + 1
v = data[:, 0] + (n * data[:, 1])
# Symmetric values
v2 = (n * data[:, 0]) + data[:, 1]
# Find where symmetric is present
m = np.isin(v2, v)
res = data[m]
print(res)
# [[1 2]
# [2 1]
# [6 6]]

关于python - 如何删除 numpy 数组中的非对称对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60038775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com