Python 当阵列非常大时,根据另一个阵列的范围有效地分离阵列的一部分

Python 当阵列非常大时,根据另一个阵列的范围有效地分离阵列的一部分,python,arrays,performance,bigdata,Python,Arrays,Performance,Bigdata,我有两组numpy数组:x1,y1和x2,y2。我想在y2数组中保留所有具有匹配y坐标的x1和y1值。我们可以假设所有y2值都存在于y1数组中 e、 g 因此,所有输出数组大小相同,并且具有相同的y坐标 我可以使用下面的代码来完成。但是,我想要使用的阵列的大小大于100k,这使得它非常缓慢且效率低下。有更好的方法吗?速度和效率是我的主要目标,如果我学会了更好的方法,那将是一个奖励!提前谢谢 x1 = [5,6,7,8,9,0] y1 = [1,2,3,4,5,6] x2 = [11,12,13

我有两组numpy数组:x1,y1和x2,y2。我想在y2数组中保留所有具有匹配y坐标的x1和y1值。我们可以假设所有y2值都存在于y1数组中

e、 g

因此,所有输出数组大小相同,并且具有相同的y坐标

我可以使用下面的代码来完成。但是,我想要使用的阵列的大小大于100k,这使得它非常缓慢且效率低下。有更好的方法吗?速度和效率是我的主要目标,如果我学会了更好的方法,那将是一个奖励!提前谢谢

x1 = [5,6,7,8,9,0]
y1 = [1,2,3,4,5,6]

x2 = [11,12,13,14]
y2 = [2,3,4,5]

max1 = max(y2)
min1 = min(y2)

for i, y in enumerate(y1):
    if (y >= min1) and (y <= max1):
        print (x1[i],y)
x1=[5,6,7,8,9,0]
y1=[1,2,3,4,5,6]
x2=[11,12,13,14]
y2=[2,3,4,5]
最大值1=最大值(y2)
最小1=最小(y2)
对于枚举(y1)中的i,y:
如果(y>=min1)和(y请尝试此操作

import numpy as np

x1 = np.array([5,6,7,8,9,0])
y1 = np.array([1,2,3,4,5,6])
x2 = np.array([5,4,3,2])
y2 = np.array([2,3,4,5])

elements = np.array([item for item in y2 if item in y1])
idxs = [np.where(y1 == item)[0][0] for item in elements]

print(x1[idxs], elements)
输出:

[6 7 8 9] [2 3 4 5]
用于性能。在两个列表相同的过程中查找匹配索引,并使用这些匹配索引对numpy数组进行切片

import numpy as np
x1 = [5,6,7,8,9,0] 
y1 = [1,2,3,4,5,6]
y2=[2,3,4,5]
x2_indices=[i for i, item in enumerate(y1) if item in y2] #[1, 2, 3, 4]
x2=np.array(x1)[x2_indices]
print(x2,y2) #(array([6, 7, 8, 9]), [2, 3, 4, 5])
如果寻找一个衬里,应比前一个衬里快(尚未测试)


当你谈论“匹配”y坐标时,你的代码只是检查是否
min(y2)匹配是什么意思?y1的预期输出可以通过
print(set(y2).intersection(set(y1))实现
。无法理解x1输出的注释。我的小示例可能会产生误导。这是我输入的粗略代码,因为我想表明我可以迭代数组中的每个值(我不想这样做,因为我想使用的数组很大)。我希望找到一种解决方案,能够以高效的方式返回数组中的所有值,该数组在我的引用数组中具有匹配的值。一个线性程序适合我,谢谢!我将使用它进行更多的速度测试,但似乎建议使用np.isin()而不是np.in1d().谢谢!谢谢!非常感谢您的回答,非常适合我的阵列。
import numpy as np
x1 = [5,6,7,8,9,0] 
y1 = [1,2,3,4,5,6]
y2=[2,3,4,5]
x2_indices=[i for i, item in enumerate(y1) if item in y2] #[1, 2, 3, 4]
x2=np.array(x1)[x2_indices]
print(x2,y2) #(array([6, 7, 8, 9]), [2, 3, 4, 5])
import numpy as np
print(np.array(x1)[np.nonzero(np.in1d(y1, y2))[0]]) #[6, 7, 8, 9])