Home  >  Article  >  Backend Development  >  How to Efficiently Roll Matrix Rows with Advanced Numpy Indexing?

How to Efficiently Roll Matrix Rows with Advanced Numpy Indexing?

DDD
DDDOriginal
2024-10-21 13:40:03386browse

How to Efficiently Roll Matrix Rows with Advanced Numpy Indexing?

Efficient Matrix Row Rolling with Numpy Advanced Indexing

Problem Statement:

Given a matrix and an array of roll values, the task is to roll each row of the matrix independently according to the corresponding roll values. For example:

A = np.array([[4, 0, 0],
              [1, 2, 3],
              [0, 0, 5]])

r = np.array([2, 0, -1])

expected_result = np.array([np.roll(row, x) for row,x in zip(A, r)])

# [[0 0 4]
#  [1 2 3]
#  [0 5 0]]

Solution using Numpy Advanced Indexing:

An efficient approach to rolling matrix rows independently is to leverage Numpy's advanced indexing capabilities:

<code class="python">import numpy as np

rows, column_indices = np.ogrid[:A.shape[0], :A.shape[1]]

# Ensure negative shift to keep column_indices valid
r[r < 0] += A.shape[1]
column_indices = column_indices - r[:, np.newaxis]

result = A[rows, column_indices]</code>

Explanation:

  • Create a grid of indices using np.ogrid that represents the rows and columns of the matrix.
  • Adjust the roll values to ensure a negative shift, resulting in valid column indices.
  • Subtract the roll values from the column indices grid, broadcasting the roll values along the rows.
  • Use advanced indexing to retrieve the rolled elements from the original matrix A.

This approach allows efficient and concise row rolling, bypassing explicit for loops and utilizing Numpy's powerful vectorized operations. Whether it is the fastest method depends on the array dimensions and specific system configuration.

The above is the detailed content of How to Efficiently Roll Matrix Rows with Advanced Numpy Indexing?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn