从2d数组中删除单元格列表的最快捷方式

时间:2022-03-10 20:21:12

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.

我有一个非常大的2D numpy数组m x n元素。对于每一行,我需要删除一个元素。因此,例如从4x6矩阵我可能需要删除[0,1],[1,4],[2,3]和[3,3] - 我将这组坐标存储在列表中。最后,矩阵的宽度最终会缩小1。

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

有没有一种标准的方法来使用面具?理想情况下,我需要尽可能高效。

1 个解决方案

#1


0  

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:

这是一个方法,使用ravel_multi_index()计算一个暗淡的索引,然后删除()元素,并重塑为两个暗淡的数组:

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]])

#1


0  

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:

这是一个方法,使用ravel_multi_index()计算一个暗淡的索引,然后删除()元素,并重塑为两个暗淡的数组:

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]])