我有两个非常大的numpy数组,它们都是3D的。我需要找到一种有效的方法来检查它们是否重叠,因为首先将它们都转换为集合会花费很长时间。我尝试使用在此找到的另一个解决方案来解决相同的问题,但适用于2D阵列,但是我没有设法使其适用于3D。这是2D解决方案:
nrows, ncols = A.shape
dtype={'names':['f{}'.format(i) for i in range(ndep)],
'formats':ndep * [A.dtype]}
C = np.intersect1d(A.view(dtype).view(dtype), B.view(dtype).view(dtype))
# This last bit is optional if you're okay with "C" being a structured array...
C = C.view(A.dtype).reshape(-1, ndep)
(其中A和B是2D数组)我需要找到重叠的numpy数组的数量,而不是特定的数组。
我们可以利用views
我在一些问答中使用过的辅助功能来发挥作用。要获得子数组的存在,我们可以np.isin
在视图上使用或使用更加费力的视图np.searchsorted
。
方法1: 使用np.isin
-
# https://stackoverflow.com/a/45313353/ @Divakar
def view1D(a, b): # a, b are arrays
a = np.ascontiguousarray(a)
b = np.ascontiguousarray(b)
void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
return a.view(void_dt).ravel(), b.view(void_dt).ravel()
def isin_nd(a,b):
# a,b are the 3D input arrays to give us "isin-like" functionality across them
A,B = view1D(a.reshape(a.shape[0],-1),b.reshape(b.shape[0],-1))
return np.isin(A,B)
方法2: 我们也可以利用np.searchsorted
于views
-
def isin_nd_searchsorted(a,b):
# a,b are the 3D input arrays
A,B = view1D(a.reshape(a.shape[0],-1),b.reshape(b.shape[0],-1))
sidx = A.argsort()
sorted_index = np.searchsorted(A,B,sorter=sidx)
sorted_index[sorted_index==len(A)] = len(A)-1
idx = sidx[sorted_index]
return A[idx] == B
因此,这两个解决方案为我们提供了a
in中每个子数组的存在掩码b
。因此,为了获得所需的计数,它应该是-isin_nd(a,b).sum()
或isin_nd_searchsorted(a,b).sum()
。
样品运行-
In [71]: # Setup with 3 common "subarrays"
...: np.random.seed(0)
...: a = np.random.randint(0,9,(10,4,5))
...: b = np.random.randint(0,9,(7,4,5))
...:
...: b[1] = a[4]
...: b[3] = a[2]
...: b[6] = a[0]
In [72]: isin_nd(a,b).sum()
Out[72]: 3
In [73]: isin_nd_searchsorted(a,b).sum()
Out[73]: 3
大型阵列上的时间-
In [74]: # Setup
...: np.random.seed(0)
...: a = np.random.randint(0,9,(100,100,100))
...: b = np.random.randint(0,9,(100,100,100))
...: idxa = np.random.choice(range(len(a)), len(a)//2, replace=False)
...: idxb = np.random.choice(range(len(b)), len(b)//2, replace=False)
...: a[idxa] = b[idxb]
# Verify output
In [82]: np.allclose(isin_nd(a,b),isin_nd_searchsorted(a,b))
Out[82]: True
In [75]: %timeit isin_nd(a,b).sum()
10 loops, best of 3: 31.2 ms per loop
In [76]: %timeit isin_nd_searchsorted(a,b).sum()
100 loops, best of 3: 1.98 ms per loop
这可能吗?如果可能,我该如何正确地做到这一点?希望能够检查它是否包含1和2,如果是,继续与程序。
问题内容: 我想为数组中的每个值返回一个布尔值,指示它是否在array中。我猜这应该是一个标准程序,但是我找不到有关如何执行此操作的任何信息。我的尝试如下: 但是,我得到了错误: 我使用的是numpy,因此首选使用numpy或标准Python的解决方案。 问题答案: 我相信您可以使用-
问题内容: 我想看看我从数据库读取的时间是否与用户提供的时间重叠。 我的数据库如下所示: 我的代码如下所示: 如果我故意输入两次重叠的时间,则不会回显错误。我究竟做错了什么? 问题答案: 当且仅当以下条件中的至少一个成立时,两个时间段P1和P2重叠: P1在P2的开始和结束之间开始() P2在P1的开始和结束之间开始() 这将捕获部分重叠的期间以及一个完全覆盖另一个期间的期间。如果两个周期重叠,则
这是一个简化的示例,但假设我想在100x100网格上生成5个唯一位置。这些位置将存储在数组[[x, y],…]中。 尝试了生成随机 x 和 y 并检查数组 [x, y] 是否已经在结果数组中的明显方法。如果是,则生成不同的值,如果不生成,则将其添加到结果数组中。 但是,这将永远不会找到重复项,因为数组在技术上是不同的对象。那么,检测数组是否包含“相等”数组/对象的首选方法是什么?
问题内容: 我想找出$ all是否包含所有$ search_this值并返回true或false。有什么想法吗? 问题答案: 看一下array_intersect()。
问题内容: 我有两个日期范围,(start1,end1)::: >> date1 &&(start2,end2)::: >> date2。 我想检查两个日期是否为OverLaped。 我的流程图 假定“ <> =”运算符对于比较是有效的。 } 任何建议将不胜感激。 问题答案: 您可以为此使用Joda-Time。 它提供指定开始时刻和结束时刻的类,并可以检查与的重叠。 就像是 版画 因为第一个间隔的