This interesting outcome was possible using a combination of two simple rules.
#pick a unique 4 from the list for comb in combinations_with_replacement([1,2,3.2,3.4,3.6,3.8,4.2,4.4,4.6,4.8],width_x*width_y): frame.flat[:] = comb # for the 4 work out all the ways they could be arranged (1, 4, 8 or 16 possibilities) for i in set(permutations(chain.from_iterable(frame))): new_pattern = np.array([i[:2], i[2:]])