Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swap slices of Numpy arrays

I love the way python is handling swaps of variables: a, b, = b, a

and I would like to use this functionality to swap values between arrays as well, not only one at a time, but a number of them (without using a temp variable). This does not what I expected (I hoped both entries along the third dimension would swap for both):

import numpy as np a = np.random.randint(0, 10, (2, 3,3)) b = np.random.randint(0, 10, (2, 5,5)) # display before a[:,0, 0] b[:,0,0] a[:,0,0], b[:, 0, 0] = b[:, 0, 0], a[:,0,0] #swap # display after a[:,0, 0] b[:,0,0] 

Does anyone have an idea? Of course I can always introduce an additional variable, but I was wondering whether there was a more elegant way of doing this.

like image 660
user2082745 Avatar asked Feb 18 '13 09:02

user2082745


People also ask

Does changing a slice of a Numpy array affect the original array?

Sliced numpy array does not modify original array.

How do you swap rows and columns in Numpy array?

To transpose NumPy array ndarray (swap rows and columns), use the T attribute ( . T ), the ndarray method transpose() and the numpy. transpose() function.


1 Answers

Python correctly interprets the code as if you used additional variables, so the swapping code is equivalent to:

t1 = b[:,0,0] t2 = a[:,0,0] a[:,0,0] = t1 b[:,0,0] = t2 

However, even this code doesn't swap values correctly! This is because Numpy slices don't eagerly copy data, they create views into existing data. Copies are performed only at the point when slices are assigned to, but when swapping, the copy without an intermediate buffer destroys your data. This is why you need not only an additional variable, but an additional numpy buffer, which general Python syntax can know nothing about. For example, this works as expected:

t = np.copy(a[:,0,0]) a[:,0,0] = b[:,0,0] b[:,0,0] = t 
like image 147
user4815162342 Avatar answered Oct 01 '22 19:10

user4815162342