![](/img/trans.png)
[英]How can I efficiently find every combination of intersection of two arrays of polygons?
[英]How can i find the intersection of two multidimensional arrays faster?
有两个具有不同行数的多维布尔数组。 我想快速找到公共行中 True 值的索引。 我写了下面的代码,但它太慢了。 有没有更快的方法来做到这一点?
a=np.random.choice(a=[False, True], size=(100,100))
b=np.random.choice(a=[False, True], size=(1000,100))
for i in a:
for j in b:
if np.array_equal(i, j):
print(np.where(i))
让我们从一个有意义的问题的版本开始,通常会打印一些东西:
a = np.random.choice(a=[False, True], size=(2, 2))
b = np.random.choice(a=[False, True], size=(4, 2))
print(f"a: \n {a}")
print(f"b: \n {b}")
matches = []
for i, x in enumerate(a):
for j, y in enumerate(b):
if np.array_equal(x, y):
matches.append((i, j))
使用scipy.cdist
的解决方案将a
中的所有行与b
中的所有行进行比较,使用汉明距离进行布尔向量比较:
import numpy as np
import scipy
from scipy import spatial
d = scipy.spatial.distance.cdist(a, b, metric='hamming')
cdist_matches = np.where(d == 0)
mathces_values = [(a[i], b[j]) for (i, j) in matches]
cdist_values = a[cdist_matches[0]], b[cdist_matches[1]]
print(f"matches_inds = \n{matches}")
print(f"matches = \n{mathces_values}")
print(f"cdist_inds = \n{cdist_matches}")
print(f"cdist_matches =\n {cdist_values}")
出去:
a:
[[ True False]
[False False]]
b:
[[ True True]
[ True False]
[False False]
[False True]]
matches_inds =
[(0, 1), (1, 2)]
matches =
[(array([ True, False]), array([ True, False])), (array([False, False]), array([False, False]))]
cdist_inds =
(array([0, 1], dtype=int64), array([1, 2], dtype=int64))
cdist_matches =
(array([[ True, False],
[False, False]]), array([[ True, False],
[False, False]]))
如果您不想import scipy
请参阅此纯 numpy 实现
可以通过使用np.newaxis
和np.tile
使 a 的形状可广播到 b 的形状来比较 a 的每一行与 b 的每一行
import numpy as np
a=np.random.choice(a=[True, False], size=(2,5))
b=np.random.choice(a=[True, False], size=(10,5))
broadcastable_a = np.tile(a[:, np.newaxis, :], (1, b.shape[0], 1))
a_equal_b = np.equal(b, broadcastable_a)
indexes = np.where(a_equal_b)
indexes = np.stack(np.array(indexes[1:]), axis=1)
如果你想比较 NDarrays 元素,我会做这样的事情:
import numpy as np
# data
a = np.random.choice(a = [False, True], size = (100,100))
b = np.random.choice(a = [False, True], size = (1000,100))
# extract matching coordinates
match = np.where((a == b[:100,:]) == True)
match = list(zip(*match))
# first 20 coordinates match
print("Number of matches:", len(match))
print(match[:20])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.