zoombini
zoombini

Reputation: 124

Fastest numpy way to remove a list of cells from a 2d array

I have a very large 2D numpy array of m x n elements. For each row, I need to remove exactly one element. So for example from a 4x6 matrix I might need to delete [0, 1], [1, 4], [2, 3], and [3, 3] - I have this set of coordinates stored in a list. In the end, the matrix will ultimately shrink in width by 1.

Is there a standard way to do this using a mask? Ideally, I need this to be as performant as possible.

Upvotes: 1

Views: 114

Answers (1)

HYRY
HYRY

Reputation: 97331

Here is a method that use ravel_multi_index() to calculate one-dim index, and then delete() the elements, and reshape back to two-dim array:

import numpy as np

n = 12
a = np.repeat(np.arange(10)[None, :], n, axis=0)
index = np.random.randint(0, 10, n)
ravel_index = np.ravel_multi_index((np.arange(n), index), a.shape)
np.delete(a, ravel_index).reshape(n, -1)

the index:

array([4, 6, 9, 0, 3, 5, 3, 8, 9, 8, 4, 4])

the result:

array([[0, 1, 2, 3, 4, 5, 6, 7, 9],
       [1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 9],
       [1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 9],
       [0, 1, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8],
       [0, 1, 2, 4, 5, 6, 7, 8, 9]])

Upvotes: 1

Related Questions