在numpy数组中查找子数组的位置
Finding location of subarray in numpy array
我想在 numpy 数组中找到子数组的位置。
例如,如果大数组的形状为 (10000, 10, 10, 10)
,即 10000 个形状为 (10,10,10) 的数组,我想找到形状为 (3,3,3)
的子数组的位置,如下所示:
subarray = array(
[[[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]],
[[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]],
[[0., 0., 0.],
[0., 1., 0.],
[0., 0., 0.]]])
所以我会知道在 n, i, j, k
的位置我会得到:
largearray[n, i:i+subarray.shape[0], j:j+subarray.shape[1], k:k+subarray.shape[2]] == subarray
很久以前我做了一个,但是skimage.util.view_as_windows
更容易实现。
import numpy as np
from skimage.util import view_as_windows as winview
test = np.random.choice((0, 1), p = (.75, .25), size = (5,10,10,10)) #smaller test array
subarray = np.zeros((3,3,3)) #what we're looking for
view = winview(test, (1,3,3,3)) #a view over 3x3x3 windows
out = np.all((view == subarray[None, ...]), (-4, -3, -2, -1)) #out=1 where the windows match
print(np.nonzero(out)) #output coordinates
Out[]: array([0, 1], dtype=int64), array([2, 7], dtype=int64), array([4, 4], dtype=int64), array([1, 1], dtype=int64))
这给出了我随机输入中 3x3x3 零框的 2 个位置的坐标。
为什么要这样做 windows?因为在 python 中循环需要永远,而将 windows 作为副本会杀死你的 RAM。 view
只是另一种在 test
中寻址内存的方法,对于此类比较更有用。
我想在 numpy 数组中找到子数组的位置。
例如,如果大数组的形状为 (10000, 10, 10, 10)
,即 10000 个形状为 (10,10,10) 的数组,我想找到形状为 (3,3,3)
的子数组的位置,如下所示:
subarray = array(
[[[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]],
[[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]],
[[0., 0., 0.],
[0., 1., 0.],
[0., 0., 0.]]])
所以我会知道在 n, i, j, k
的位置我会得到:
largearray[n, i:i+subarray.shape[0], j:j+subarray.shape[1], k:k+subarray.shape[2]] == subarray
很久以前我做了一个skimage.util.view_as_windows
更容易实现。
import numpy as np
from skimage.util import view_as_windows as winview
test = np.random.choice((0, 1), p = (.75, .25), size = (5,10,10,10)) #smaller test array
subarray = np.zeros((3,3,3)) #what we're looking for
view = winview(test, (1,3,3,3)) #a view over 3x3x3 windows
out = np.all((view == subarray[None, ...]), (-4, -3, -2, -1)) #out=1 where the windows match
print(np.nonzero(out)) #output coordinates
Out[]: array([0, 1], dtype=int64), array([2, 7], dtype=int64), array([4, 4], dtype=int64), array([1, 1], dtype=int64))
这给出了我随机输入中 3x3x3 零框的 2 个位置的坐标。
为什么要这样做 windows?因为在 python 中循环需要永远,而将 windows 作为副本会杀死你的 RAM。 view
只是另一种在 test
中寻址内存的方法,对于此类比较更有用。