这是一种矢量化方法,使用
broadcasting
-
# Get mask of matching elements against the iterators
m,n = I.shape
Imask = I == np.arange(m)[:,None,None,None]
Jmask = J == np.arange(n)[:,None,None]
# Get the mask of intersecting ones
mask = Imask & Jmask
# Get D intersection masked array
Dvals = np.where(mask,D,np.inf)
# Get argmin along merged last two axes. Index into flattened V for final o/p
out = V.ravel()[Dvals.reshape(m,n,-1).argmin(-1)]
样本输入、输出-
In [136]: I = np.array([[0,1,2],[1,1,0],[0,0,2]])
...: J = np.array([[1,1,1],[1,2,1],[0,1,0]])
...: D = np.array([[1.2, 3.4, 2.2],[2.2, 4.3, 2.3],[7.1, 6.1, 2.7]])
...: V = np.array([[1.1 , 8.1, 9.1],[3.1, 7.1, 2.1],[0.1, 5.1, 3.1]])
...:
In [144]: out
Out[144]:
array([[ 0.1, 1.1, 1.1], # To verify : v[0,1] = 1.1
[ 1.1, 3.1, 7.1],
[ 3.1, 9.1, 1.1]])