I have two numpy arrays, both with 1 million spaces, and all the values inside the first one have a corresponding value with the values in the second one. I want to shuffle both of them while keeping the respective values. How do I do that?
            Asked
            
        
        
            Active
            
        
            Viewed 426 times
        
    3 Answers
0
            Since both arrays are of same size, you can use Numpy Array Indexing.
def unison_shuffled_copies(a, b):
    assert len(a) == len(b)                  # don't need if we know array a and b is same length
    p = numpy.random.permutation(len(a))     # generate the shuffled indices
    return a[p], b[p]                        # make the shuffled copies using same arrangement according to p
This is referencing this answer, with some changes.
 
    
    
        Spooked Husky
        
- 36
- 3
0
            
            
        You can keep track of the numpy.random.state with get_state() and reset it between shuffles with set_state(). This will make the shuffle behave the same on both arrays.
import numpy as np
arr1 = np.arange(9).reshape((3, 3))
arr2 = np.arange(10,19).reshape((3, 3))
arr1, arr2
# array([[0, 1, 2],
#        [3, 4, 5],
#        [6, 7, 8]]),
# array([[10, 11, 12],
#        [13, 14, 15],
#        [16, 17, 18]])
# get state
state = np.random.get_state()
np.random.shuffle(arr1)
arr1
# array([[6, 7, 8],
#        [3, 4, 5],
#        [0, 1, 2]])
# reset state and shuffle other array
np.random.set_state(state)
np.random.shuffle(arr2)
arr2
#array([[16, 17, 18],
#       [13, 14, 15],
#       [10, 11, 12]])
 
    
    
        Mark
        
- 90,562
- 7
- 108
- 148
0
            
            
        I am a bit late, but a good solution would be to shuffle the indices and retrieve the shuffled values accordingly. For instance,
Say I have keys = np.array([1, 2, 3, 4, 5]) and values = np.array([1, 2, 3, 4, 5])
In order to shuffle while preserving their locations, you can create another variable "idcs"
idcs = np.arange(0, keys.shape[0])
Then just shuffle
np.random.shuffle(idcs)
And index both "keys" and "values" the same way
newKeys = keys[idcs]
newValues = values[idcs]
print(newKeys)
print(newValues)
-> [3 2 5 1 4]
-> [3 2 5 1 4]
 
    
    
        Leonardo
        
- 272
- 3
- 16
