मेरे पास अलग-अलग आकृतियों के दो सुन्न सरणियां हैं, लेकिन एक ही लंबाई (अग्रणी आयाम) के साथ। मैं उनमें से प्रत्येक को फेरबदल करना चाहता हूं, जैसे कि संबंधित तत्व पत्र-व्यवहार करते रहते हैं - अर्थात उन्हें अपने प्रमुख मसलों के संबंध में एकजुट करना चाहिए।
यह कोड काम करता है, और मेरे लक्ष्यों को दिखाता है:
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
उदाहरण के लिए:
>>> 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]))
हालाँकि, यह स्पष्ट, अक्षम और धीमा लगता है, और इसमें सरणियों की एक प्रतिलिपि बनाने की आवश्यकता होती है - मैं उन्हें जगह में फेरबदल करना चाहता हूं, क्योंकि वे काफी बड़े होंगे।
क्या इस बारे में जाने का कोई बेहतर तरीका है? तेज़ निष्पादन और कम मेमोरी उपयोग मेरे प्राथमिक लक्ष्य हैं, लेकिन सुरुचिपूर्ण कोड भी अच्छा होगा।
एक अन्य विचार मुझे यह था:
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)
यह काम करता है ... लेकिन यह थोड़ा डरावना है, क्योंकि मैं थोड़ा गारंटी देता हूं कि यह काम करना जारी रखेगा - यह उस तरह का नहीं दिखता है जो उदाहरण के लिए, खस्ता संस्करण में जीवित रहने की गारंटी है।