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

Posted

技术标签:

【中文标题】当数组非常大时,根据另一个数组的范围有效地分离数组的一部分【英文标题】:Efficiently seperate a portion of an array based on the range of another when arrays are very large 【发布时间】:2018-09-26 13:55:18 【问题描述】:

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

例如

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

#as y2 values 2,3,4,5 are present in y1, I want the output to be:
x1 = [6,7,8,9] y1 = [2,3,4,5]

因此,所有输出数组的大小相同,并且具有相同的 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)

【问题讨论】:

当您谈论“匹配”y 坐标时,您的代码只是检查 min(y2) &lt;= y1 &lt;= max(y2) 是否比实际匹配的代码做得更好。要获得的效率可能在其他地方。即更好地输入/输出数据 匹配是什么意思? y1 的预期输出可以简单地通过print(set(y2).intersection(set(y1))) 来实现。无法理解 x1 输出 感谢您的评论。我的小例子可能会误导我。这是我输入的粗略代码,因为我想表明我可以遍历数组中的每个值(我不想这样做,因为我想使用的数组很大)。我希望有一种解决方案能够以有效的方式返回数组中的所有值,这些值在我的参考数组中具有匹配的值。 【参考方案1】:

使用numpy 来提高性能。一次性找到两个列表相同的匹配索引,并使用这些匹配索引对 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])

如果正在寻找一种班轮,并且应该比以前的班轮更快(尚未测试)

import numpy as np
print(np.array(x1)[np.nonzero(np.in1d(y1, y2))[0]]) #[6, 7, 8, 9])

【讨论】:

一个班轮为我工作,谢谢!我将使用它进行更多速度测试,但似乎 np.isin() 优于 np.in1d()。谢谢!【参考方案2】:

试试这个

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数组

如何简洁地将一个数组的范围分配给另一个数组的范围?

使用 numpy 数组有效地索引 numpy 数组

RPC:当数组太大时,xdr_bytes“无法编码参数”

无法从另一个函数(在全局范围内定义)访问变量(数组)

根据if else(或switch)c#声明不同对象类型的2D数组