Farklı şekillerde, ancak aynı uzunlukta (önde gelen boyut) iki numpy dizim var. Her birini karıştırmak istiyorum, böylece karşılık gelen elemanlar karşılık gelmeye devam ediyor - yani önde gelen endekslerine göre bunları birlikte karıştırın.
Bu kod işe yarar ve hedeflerimi gösterir:
def shuffle_in_unison(a, b):
assert len(a) == len(b)
shuffled_a = numpy.empty(a.shape, dtype=a.dtype)
shuffled_b = numpy.empty(b.shape, dtype=b.dtype)
permutation = numpy.random.permutation(len(a))
for old_index, new_index in enumerate(permutation):
shuffled_a[new_index] = a[old_index]
shuffled_b[new_index] = b[old_index]
return shuffled_a, shuffled_b
Örneğin:
>>> a = numpy.asarray([[1, 1], [2, 2], [3, 3]])
>>> b = numpy.asarray([1, 2, 3])
>>> shuffle_in_unison(a, b)
(array([[2, 2],
[1, 1],
[3, 3]]), array([2, 1, 3]))
Bununla birlikte, bu tıknaz, verimsiz ve yavaş hissediyor ve dizilerin bir kopyasını almayı gerektiriyor - oldukça büyük olacakları için onları yerinde karıştırmayı tercih ederim.
Bununla ilgili daha iyi bir yol var mı? Daha hızlı yürütme ve daha az bellek kullanımı birincil hedeflerimdir, ancak zarif kod da iyi olurdu.
Başka bir düşünce vardı:
def shuffle_in_unison_scary(a, b):
rng_state = numpy.random.get_state()
numpy.random.shuffle(a)
numpy.random.set_state(rng_state)
numpy.random.shuffle(b)
Bu işe yarıyor ... ama biraz korkutucu, çalışmaya devam edeceğine dair çok az garanti görüyorum - örneğin, numpy sürümünde hayatta kalmayı garanti eden bir şey gibi görünmüyor.