How to Solve Python ValueError: matmul: Input Operand Mismatch in Matrix Multiplication

by | Programming, Python, Tips

In Python, the error ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) arises when attempting matrix multiplication and the dimensions of the matrices are not aligned correctly according to the rules of matrix multiplication.

In matrix multiplication, if you have two matrices A and B, the number of columns in A must match the number of rows in B. Otherwise, Python raises a ValueError, as it cannot perform the operation due to dimensional mismatch.

We will go through an example and how to solve it.

Error Explanation

The error looks a bit scary, but let’s break it into smaller pieces to help you understand what’s going on!

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?)
  • matmul: Refers to matrix multiplication using numpy.matmul or the @ operator.
  • Input operand 1 has a mismatch in its core dimension 0: Operand 1 refers to the second matrix, and its first dimension (rows) is incompatible with the first matrix’s second dimension (columns).
  • gufunc signature (n?,k),(k,m?)->(n?,m?): This signature indicates the expected dimensions for matrix multiplication, where the number of columns in the first matrix (k) must match the number of rows in the second matrix (k).

Example

import numpy as np

# Define two incompatible matrices
A = np.array([[1, 2, 3], [4, 5, 6]])  # Shape: (2, 3)
B = np.array([[1, 2], [3, 4]])        # Shape: (2, 2)

# Attempting matrix multiplication
result = A @ B

When you run this code, Python will raise the following error:

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, 
with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 3)

For matrix multiplication to be valid:

  • The number of columns in the first matrix (A) must be equal to the number of rows in the second matrix (B).

The matrix A has a shape of (2, 3) (two rows, three columns), and the matrix B has a shape of (2, 2) (two rows, three columns). Since the number of columns in A (3) does not match the number of rows in B (2), this results in the ValueError.

Solution

To fix this error, ensure that the dimensions of the two matrices are compatible for matrix multiplication. In this case, you need to modify B so that its number of rows matches the number of columns in A.

Here’s how you can adjust the matrices to make them compatible:

import numpy as np

# Define compatible matrices
A = np.array([[1, 2, 3], [4, 5, 6]])  # Shape: (2, 3)
B = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])  # Shape: (3, 3)

# Perform matrix multiplication
result = A @ B

print(result)

Output:

[30 36 42]
 [66 81 96]]

Now, matrix A has a shape of (2, 3) and matrix B has a shape of (3, 3), making them compatible for matrix multiplication. The resulting matrix will have a shape of (2, 3).

General Approach to Fixing This Error

  1. Check the dimensions: Ensure the number of columns in the first matrix equals the number of rows in the second matrix.
  2. Reshape or slice matrices: If necessary, reshape or slice the matrices to ensure compatibility.
  3. Transpose if needed: In some cases, transposing one of the matrices can fix the issue, but please ensure this matches your computation’s logic.

Example Where Transposing is Necessary

Sometimes, the structure of the matrices cannot be directly aligned for matrix multiplication, but by transposing one of the matrices, you can make them compatible.

Let’s look at an example:

import numpy as np

# Define two incompatible matrices
A = np.array([[1, 2], [3, 4], [5, 6]])  # Shape: (3, 2)
B = np.array([[1, 2, 3], [4, 5, 6]])    # Shape: (2, 3)

# Attempting matrix multiplication
result = A @ B
print(result)

Output:

[[ 9 12 15]
 [19 26 33]
 [29 40 51]]

However, let’s modify matrix B to make them incompatible by changing its shape to (3, 2):

import numpy as np

# Define two incompatible matrices
A = np.array([[1, 2], [3, 4], [5, 6]])  # Shape: (3, 2)
B = np.array([[1, 2], [3, 4], [5, 6]])  # Shape: (3, 2)

# Attempting matrix multiplication (this will raise an error)
result = A @ B

This raises the familiar error:

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 3 is different from 2)

Here, matrix A has 2 columns, but matrix B has 3 rows, which makes them incompatible for multiplication.

Solution: Transposing the Matrix

By transposing matrix B, we can make the shapes compatible for matrix multiplication:

import numpy as np

# Define two matrices
A = np.array([[1, 2], [3, 4], [5, 6]])  # Shape: (3, 2)
B = np.array([[1, 2], [3, 4], [5, 6]])  # Shape: (3, 2)

# Transpose matrix B to make the shapes compatible
B_T = B.T  # Shape: (2, 3)

# Perform matrix multiplication
result = A @ B_T

print(result)

After transposing B, it now has a shape of (2, 3), which is compatible with A‘s shape of (3, 2). The output will be:

[[ 5 11 17]
 [11 25 39]
 [17 39 61]]

The ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0 error typically occurs due to incompatible matrix shapes. By checking and adjusting the dimensions of your matrices, you can resolve this error and successfully perform matrix multiplication.

Congratulations on reading to the end of this tutorial!

For further reading on NumPy arrays, go to the article: How to Solve Python ValueError: operands could not be broadcast together with shapes

Have fun and happy researching!

Profile Picture
Research Scientist at Moogsoft | + posts

Suf is a research scientist at Moogsoft, specializing in Natural Language Processing and Complex Networks. Previously he was a Postdoctoral Research Fellow in Data Science working on adaptations of cutting-edge physics analysis techniques to data-intensive problems in industry. In another life, he was an experimental particle physicist working on the ATLAS Experiment of the Large Hadron Collider. His passion is to share his experience as an academic moving into industry while continuing to pursue research. Find out more about the creator of the Research Scientist Pod here and sign up to the mailing list here!