Другое возможное решение, которое я придумал, подумав об этом немного больше, - это чтобы вторая карта сохранила размер первой (которая может или не может стоить попадания в память) и выборочно добавила новые элементы:
#!/usr/bin/env python
import numpy as np
prob = 0.5
grid = np.random.rand(4,4)
mask = grid > 0.5
masklength = np.sum(mask)
# initialise with false map
second_mask = np.zeros((4,4), dtype=np.bool)
# then selectively add to this map using the second criteria
second_mask[mask] = np.random.rand(masklength) < prob
# this now acts on the original object
grid[second_mask] = 100
Хотя это немного дольше, кажется, что он читается лучше (на мой взгляд начинающим), и в тестах скорости он выполняет в то же время.