Converting a vector image to matrix











up vote
4
down vote

favorite
1












I am playing with the cifar-10 dataset (available here) and for now I would like to plot one of the images of a batch.



The images are represented as vectors when I get them from pickle:




From the cifar-10 documentation:

The first 1024 entries (of an image) contain the red channel values, the next 1024 the green, and the final 1024 the blue. The image is stored in row-major order, so that the first 32 entries of the array are the red channel values of the first row of the image.




What I came up with to plot an image is this:



import numpy as np
import matplotlib.pyplot as plt

# get the dataset
a = unpickle('./cifar-10/data_batch_1')
# get the first image
img = np.array(a[b'data'][0])
# transform it to a 3 x 1024 array, one row per color channel
# and transpose it to a 1024 x 3 array, one row per rgb pixel
img = img.reshape(3, 1024).T
# reshape it so we can plot it as a 32 x 32 image with 3 color channels
img = img.reshape(32, 32, 3)

# plot
plt.imshow(img)
plt.show()


It's my first attempt at matrix manipulation so even if this is concise, I feel like it could be simpler. What do you guys think?










share|improve this question




























    up vote
    4
    down vote

    favorite
    1












    I am playing with the cifar-10 dataset (available here) and for now I would like to plot one of the images of a batch.



    The images are represented as vectors when I get them from pickle:




    From the cifar-10 documentation:

    The first 1024 entries (of an image) contain the red channel values, the next 1024 the green, and the final 1024 the blue. The image is stored in row-major order, so that the first 32 entries of the array are the red channel values of the first row of the image.




    What I came up with to plot an image is this:



    import numpy as np
    import matplotlib.pyplot as plt

    # get the dataset
    a = unpickle('./cifar-10/data_batch_1')
    # get the first image
    img = np.array(a[b'data'][0])
    # transform it to a 3 x 1024 array, one row per color channel
    # and transpose it to a 1024 x 3 array, one row per rgb pixel
    img = img.reshape(3, 1024).T
    # reshape it so we can plot it as a 32 x 32 image with 3 color channels
    img = img.reshape(32, 32, 3)

    # plot
    plt.imshow(img)
    plt.show()


    It's my first attempt at matrix manipulation so even if this is concise, I feel like it could be simpler. What do you guys think?










    share|improve this question


























      up vote
      4
      down vote

      favorite
      1









      up vote
      4
      down vote

      favorite
      1






      1





      I am playing with the cifar-10 dataset (available here) and for now I would like to plot one of the images of a batch.



      The images are represented as vectors when I get them from pickle:




      From the cifar-10 documentation:

      The first 1024 entries (of an image) contain the red channel values, the next 1024 the green, and the final 1024 the blue. The image is stored in row-major order, so that the first 32 entries of the array are the red channel values of the first row of the image.




      What I came up with to plot an image is this:



      import numpy as np
      import matplotlib.pyplot as plt

      # get the dataset
      a = unpickle('./cifar-10/data_batch_1')
      # get the first image
      img = np.array(a[b'data'][0])
      # transform it to a 3 x 1024 array, one row per color channel
      # and transpose it to a 1024 x 3 array, one row per rgb pixel
      img = img.reshape(3, 1024).T
      # reshape it so we can plot it as a 32 x 32 image with 3 color channels
      img = img.reshape(32, 32, 3)

      # plot
      plt.imshow(img)
      plt.show()


      It's my first attempt at matrix manipulation so even if this is concise, I feel like it could be simpler. What do you guys think?










      share|improve this question















      I am playing with the cifar-10 dataset (available here) and for now I would like to plot one of the images of a batch.



      The images are represented as vectors when I get them from pickle:




      From the cifar-10 documentation:

      The first 1024 entries (of an image) contain the red channel values, the next 1024 the green, and the final 1024 the blue. The image is stored in row-major order, so that the first 32 entries of the array are the red channel values of the first row of the image.




      What I came up with to plot an image is this:



      import numpy as np
      import matplotlib.pyplot as plt

      # get the dataset
      a = unpickle('./cifar-10/data_batch_1')
      # get the first image
      img = np.array(a[b'data'][0])
      # transform it to a 3 x 1024 array, one row per color channel
      # and transpose it to a 1024 x 3 array, one row per rgb pixel
      img = img.reshape(3, 1024).T
      # reshape it so we can plot it as a 32 x 32 image with 3 color channels
      img = img.reshape(32, 32, 3)

      # plot
      plt.imshow(img)
      plt.show()


      It's my first attempt at matrix manipulation so even if this is concise, I feel like it could be simpler. What do you guys think?







      python image numpy






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 27 mins ago









      Jamal

      30.2k11115226




      30.2k11115226










      asked Aug 18 '17 at 9:07









      Leogout

      1317




      1317






















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          One alternative is to transform it to the right shapes, then use moveaxis. I don't know how much simpler this is than what you've got, I guess it avoids one reshaping operation.



          img = img.reshape(3, 32, 32)
          img = np.moveaxis(img, 0, -1) # move the first axis to the end


          or as a one-liner:



          img = np.moveaxis(img.reshape(3, 32, 32), 0, -1)


          Note that moveaxis returns a view, meaning that no data is copied.






          share|improve this answer





















            Your Answer





            StackExchange.ifUsing("editor", function () {
            return StackExchange.using("mathjaxEditing", function () {
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
            });
            });
            }, "mathjax-editing");

            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "196"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f173325%2fconverting-a-vector-image-to-matrix%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            0
            down vote













            One alternative is to transform it to the right shapes, then use moveaxis. I don't know how much simpler this is than what you've got, I guess it avoids one reshaping operation.



            img = img.reshape(3, 32, 32)
            img = np.moveaxis(img, 0, -1) # move the first axis to the end


            or as a one-liner:



            img = np.moveaxis(img.reshape(3, 32, 32), 0, -1)


            Note that moveaxis returns a view, meaning that no data is copied.






            share|improve this answer

























              up vote
              0
              down vote













              One alternative is to transform it to the right shapes, then use moveaxis. I don't know how much simpler this is than what you've got, I guess it avoids one reshaping operation.



              img = img.reshape(3, 32, 32)
              img = np.moveaxis(img, 0, -1) # move the first axis to the end


              or as a one-liner:



              img = np.moveaxis(img.reshape(3, 32, 32), 0, -1)


              Note that moveaxis returns a view, meaning that no data is copied.






              share|improve this answer























                up vote
                0
                down vote










                up vote
                0
                down vote









                One alternative is to transform it to the right shapes, then use moveaxis. I don't know how much simpler this is than what you've got, I guess it avoids one reshaping operation.



                img = img.reshape(3, 32, 32)
                img = np.moveaxis(img, 0, -1) # move the first axis to the end


                or as a one-liner:



                img = np.moveaxis(img.reshape(3, 32, 32), 0, -1)


                Note that moveaxis returns a view, meaning that no data is copied.






                share|improve this answer












                One alternative is to transform it to the right shapes, then use moveaxis. I don't know how much simpler this is than what you've got, I guess it avoids one reshaping operation.



                img = img.reshape(3, 32, 32)
                img = np.moveaxis(img, 0, -1) # move the first axis to the end


                or as a one-liner:



                img = np.moveaxis(img.reshape(3, 32, 32), 0, -1)


                Note that moveaxis returns a view, meaning that no data is copied.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered 10 hours ago









                Cris Luengo

                2,489319




                2,489319






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Code Review Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    Use MathJax to format equations. MathJax reference.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f173325%2fconverting-a-vector-image-to-matrix%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Create new schema in PostgreSQL using DBeaver

                    Deepest pit of an array with Javascript: test on Codility

                    Costa Masnaga