在另一个包含多个二维数组的数组中查找二维数组的最快方法



嗨,我正试图在一个包含多个2d数组的数组中执行搜索操作,将其itens与特定数组进行比较。我设法使用for循环在大数组内的itens中迭代,但我必须执行10^6次搜索,而for循环的长度可能会增长到2^100,因此它变得非常耗时。我想知道是否有一种方法可以使用np.where或np.isi((函数加快搜索速度。

这是较慢工作方法的一个例子

import numpy as np
frequencies = {}
b = np.array ([[0, 0, 0], [0, 0, 0], [1, 1, 1]]) #template
a = np.array([[[1, 1, 1], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [1, 1, 1], [0, 0, 0]],[[0, 0, 0], [0, 0, 0], [1, 1, 1]],[[0, 0, 1], [0, 0, 1], [0, 0, 1]],[[0, 1, 0], [0, 1, 0], [0, 1, 0]],[[1, 0, 0], [1, 0, 0], [1, 0, 0]]])
#I need to know if b is inside a and the index where it its located
for I in range (a): 
if np.all(b==a[I]):
frequencies [I] = frequencies [I] + 1

我想做这样的东西。我需要存储b位于a内的索引,该索引位于字典frequency的索引c

import numpy as np
frequencies = {}
b = np.array ([[0, 0, 0], [0, 0, 0], [1, 1, 1]]) #template
a = np.array([[[1, 1, 1], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [1, 1, 1], [0, 0, 0]],[[0, 0, 0], [0, 0, 0], [1, 1, 1]],[[0, 0, 1], [0, 0, 1], [0, 0, 1]],[[0, 1, 0], [0, 1, 0], [0, 1, 0]],[[1, 0, 0], [1, 0, 0], [1, 0, 0]]])
c = np.where(np.all(b==a))
frequencies [c] = frequencies [c] + 1

您可以使用具有双轴的NumPy.all,然后使用NumPy.argwhere来查找如下索引:

b = np.array ([[0, 0, 0], [0, 0, 0], [1, 1, 1]])
a = np.array([[[1, 1, 1], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [1, 1, 1], [0, 0, 0]],[[0, 0, 0], [0, 0, 0], [1, 1, 1]],[[0, 0, 1], [0, 0, 1], [0, 0, 1]],[[0, 1, 0], [0, 1, 0], [0, 1, 0]],[[1, 0, 0], [1, 0, 0], [1, 0, 0]]])
np.all(b == a, axis=(-1))
# array([[False,  True, False],
#        [ True, False, False],
#        [ True,  True,  True],
#        [False, False, False],
#        [False, False, False],
#        [False, False, False]])
np.all(b == a, axis=(-1,1))
# array([False, False,  True, False, False, False])
indexs = np.argwhere(np.all(b == a, axis=(-1, 1)))

输出:

>>> indexs
array([[2]])

最新更新