1

The following code is trying to convert the image array to string, and then regenerate the image from string.

import numpy as np
import matplotlib.pyplot as plt

image = np.ones((28,28))
print("image: {}".format(image.shape))

string = "{}".format(image.tostring())
print("len: {}".format(len(string)))

string_to_image = np.fromstring(string)
print("string_to_image: {}".format(string_to_image.shape))

Here is the output:

image: (28, 28)
len: 22739

/tmp/ipykernel_2794/3542140279.py:7: DeprecationWarning: tostring() is deprecated. Use tobytes() instead.
  string = "{}".format(image.tostring())
/tmp/ipykernel_2794/3542140279.py:10: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
  string_to_image = np.fromstring(string)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/tmp/ipykernel_2794/3542140279.py in <cell line: 10>()
      8 print("len: {}".format(len(string)))
      9 
---> 10 string_to_image = np.fromstring(string)
     11 print("string_to_image: {}".format(string_to_image.shape))

ValueError: string size must be a multiple of element size

How to fix the error?

2 Answers 2

1

Check Below code, need to use right datatype dtype=np.uint8

string_to_image = np.fromstring(string, dtype=np.uint8)
Sign up to request clarification or add additional context in comments.

Comments

1

Alright so the first problem is the DeprecationWarning. With Python 3.2 and onwards, .tostring() and .fromstring have been replaced with .tobytes() and .frombuffer(). They are functionally the same, so you don't lose anything from using them, however for .frombuffer() to work properly we need to make sure we pass a bytes-like object so I removed the "{}".format() part.

The next problem is the shape. When you convert a numpy array to a string (or bytes-like object) it loses it's shape, however we cans imply fix this but using the .reshape() method.

And that's it, the code with all the changes is below and it should work as intended:)

import numpy as np
import matplotlib.pyplot as plt

image = np.ones((28,28))
print("image: {}".format(image.shape))

string = image.tobytes()
print("len: {}".format(str(string)))

string_to_image = np.frombuffer(string, dtype=int).reshape((28,28))
print("string_to_image: {}".format(string_to_image.shape))

1 Comment

The string in your code is a type of "bytes", my question is for converting it to "string" and then get the image from "string", not from bytes.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.