NumPy DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs

Updated: January 22, 2024 By: Guest Contributor Post a comment

Understanding the Issue

This warning emerges when using the numpy.fromstring function in ‘binary’ mode. The function was intended to create a NumPy array from a string of data, such as binary data read from a file. Since the function can behave unexpectedly with Unicode inputs – which now are more prevalent – this mode has been deprecated in favor of numpy.frombuffer, which works more reliably with binary data.

The main reason behind the deprecation is to encourage developers to use more consistent and less error-prone methods of reading binary data into NumPy arrays. numpy.fromstring does not handle cases where the data contains multi-byte characters, typically found in Unicode strings. By using numpy.frombuffer, you do not have to worry about the encoding of the input string, which is more appropriate for handling binary data.

Solution 1: Switch to using numpy.frombuffer

Replace the usage of numpy.fromstring with numpy.frombuffer to eliminate the warning and ensure that your code handles binary data properly. This method is the most straightforward fix, as numpy.frombuffer is the recommended alternative by NumPy developers.

  • Locate the deprecated use of numpy.fromstring in your codebase.
  • Replace numpy.fromstring with numpy.frombuffer.
  • Ensure that the input to numpy.frombuffer is a bytes-like object.

Code Example:

import numpy as np

# Previously using fromstring
# data = "\x01\x02\x03\x04"
# array = np.fromstring(data, dtype=np.uint8)

# Correct approach using frombuffer
byte_data = b"\x01\x02\x03\x04"
array = np.frombuffer(byte_data, dtype=np.uint8)
print(array)

Output: [1 2 3 4]

This solution is beneficial as it follows the current best practices recommended by NumPy developers. However, it is important to note that numpy.frombuffer expects a buffer-like input, which may require minor adjustments to how your data is read or processed before conversion. Failure to provide a proper buffer could result in an error.

Solution 2: Read Data as Bytes Before Conversion

When reading data from a file, ensure that the file is opened in binary mode to produce a bytes object that can be used directly with numpy.frombuffer. This prevents any encoding issues and ensures that the data is read as raw bytes.

  • Open the file in binary mode by using the ‘rb’ mode in the open() function.
  • Read the data into a bytes object.
  • Convert the bytes object to a NumPy array using numpy.frombuffer.

Code Example:

import numpy as np

with open('binaryfile.bin', 'rb') as f:
    byte_data = f.read()

array = np.frombuffer(byte_data, dtype=np.uint8)
print(array)


This approach is particularly advantageous when dealing with file I/O, as it clearly separates the concerns of reading data and converting it into a NumPy array. However, it expects files to be in binary format and might not be suitable for text data unless the encoding is handled separately before conversion.