对于ints,这里有一种基于dimensionality-reduction更详细讨论的方法^{}-# Based on https://stackoverflow.com/a/38674038/ @Divakar
def matching_index(X, searched_values, invalid_val=-1):
dims = np.maximum(X.max(0),searched_values.max(0))+1
X1D = np.ravel_multi_index(X.T,dims)
searched_valuesID = np.ravel_multi_index(searched_values.T,dims)
sidx = X1D.argsort()
sorted_index = np.searchsorted(X1D,searched_valuesID,sorter=sidx)
sorted_index[sorted_index==len(X1D)] = len(X1D)-1
idx = sidx[sorted_index]
valid = X1D[idx] == searched_valuesID
idx[~valid] = invalid_val
return valid, idx
# Convert to array
colors = np.asarray(colors)
# Get matching indices and corresponding valid mask
v, idx = matching_index(colors[:,:3],image.reshape(-1,3))
image2D = np.where(v,colors[:,-1][idx],0).reshape(image.shape[:-1])
# If you need a 3D image output
image3D = np.broadcast_to(image2D[...,None], image2D.shape + (3,))
我们还可以使用views为泛型数据实现matching_index的等效版本-
^{pr2}$