简体   繁体   中英

How to use numpy to flip this array?

Suppose I have an array like this:

a = array([[[ 29,  29,  27],
            [ 36,  38,  40],
            [ 86,  88,  89]],
           [[200, 200, 198],
            [199, 199, 197]
            [194, 194, 194]]])

and I want to flip the 3rd element from left to right in the list-of-lists so it will become like this:

b = array([[[ 29,  29,  89],     # 27 became 89
            [ 36,  38,  40],
            [ 86,  88,  27]],    # 89 became 27
           [[200, 200, 194],     # 198 became 194
            [199, 199, 197],
            [194, 194, 198]]])   # 194 became 198

I looked up the NumPy manual but I still cannot figure out a solution. .flip and .fliplr look suitable in this case, but how do I use them?

Index the array to select the sub-array, using:

> a[:,:,-1]
array([[198, 197, 194],
       [ 27,  40,  89]])

This selects the last element along the 3rd dimension of a . The sub-array is of shape (2,3) . Then reverse the selection using:

a[:,:,-1][:,::-1]

The second slice, [:,::-1] , takes everything along the first dimension as-is ( [:] ), and all of the elements along the second dimension, but reversed ( [::-1] ). The slice syntax is basically saying start at the first element, go the last element ( [:] ), but do it in the reverse order ( [::-1] ). You could pseudo-code write it as [start here : end here : use this step size] . The the -1 tells it walk backwards.

And assign it to the first slice of the original array. This updates/overwrites the original value of a

a[:,:,-1] = a[:,:,-1][:,::-1]

> a
array([[[ 29,  29,  89],
        [ 36,  38,  40],
        [ 86,  88,  27]],

       [[200, 200, 194],
        [199, 199, 197],
        [194, 194, 198]]])

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM