Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Transpose array and actually reorder memory

I have a 3-D NumPy array, e.g.

a = np.random.random((2,3,5))

I would like to transpose the last two axes, i.e.

b = a.transpose(0,2,1)

However, I do not want a view with twiddled strides! I want to actually copy the array and reorder it in memory. What is the best way to achieve this?

like image 579
bdforbes Avatar asked Nov 07 '13 01:11

bdforbes


2 Answers

The copy() method will reorder to C-contiguous order by default:

b = a.transpose(0,2,1).copy()

Be careful: the copy() function has a different default behavior. With the function, you must explicitly specify the order to ensure a C-contiguous copy:

b = np.copy(a.transpose(0,2,1), order='C')

(Note that the docstring for the function says that the ndarray method is the preferred method for creating an array copy.)

like image 84
Warren Weckesser Avatar answered Oct 24 '22 07:10

Warren Weckesser


Under the hood, the stride of b is different than a.

prefer to use ascontiguousarray, which will copy the memory when it's needed. Whereas copy will always copy memory.

like image 35
Izana Avatar answered Oct 24 '22 08:10

Izana