Python 快速高效的数组切片避免删除操作
我试图获取数组a(N,3)的一个切片(例如元素1-3和5-N),避免使用numpy.delete。该过程的示例如下所示:Python 快速高效的数组切片避免删除操作,python,numpy,array-broadcasting,numpy-ufunc,numpy-ndarray,Python,Numpy,Array Broadcasting,Numpy Ufunc,Numpy Ndarray,我试图获取数组a(N,3)的一个切片(例如元素1-3和5-N),避免使用numpy.delete。该过程的示例如下所示: [[1,2,3],[4,5,6],[7,8,9],[3,2,1]] ==> [[1,2,3],[3,2,1]] 我希望使用类似于 A[A != [1,2,3] ].reshape() 但这会执行元素级比较,因此删除的元素比我希望的要多。怎么做?我提出了这个想法,但似乎太复杂和缓慢: A_removed = A[first_removed:last:removed
[[1,2,3],[4,5,6],[7,8,9],[3,2,1]] ==> [[1,2,3],[3,2,1]]
我希望使用类似于
A[A != [1,2,3] ].reshape()
但这会执行元素级比较,因此删除的元素比我希望的要多。怎么做?我提出了这个想法,但似乎太复杂和缓慢:
A_removed = A[first_removed:last:removed,:]
mask = np.not_equal(A[:,None],A_removed)
mask = np.logical_and.reduce(mask,1)
A = A[mask].reshape()
有没有一种更快/更干净的方法
一个元素的任意两个元素不能相等的假设总是成立的
重读这个问题,我现在很确定OP想要的是与我最初发布的相反的内容。以下是您如何获得的:
import numpy as np
def selectRow(arr, selrow):
selset = set(selrow)
return np.array([row for row in arr if selset == set(row)])
arr = np.array([
[1,2,3],
[4,5,6],
[7,8,9],
[3,2,1]
])
selectRow(arr, [1,2,3])
输出:
array([[1, 2, 3],
[3, 2, 1]])
array([[4, 5, 6],
[7, 8, 9],
[3, 2, 1]])
array([[4, 5, 6],
[7, 8, 9]])
我暂时保留原始答案,以防万一我错了
原始答案
订购版
那就:
import numpy as np
def withoutRow(arr, badrow):
return np.array([row for row in arr if not np.array_equal(row, badrow)])
然后,您将使用它作为:
arr = np.array([
[1,2,3],
[4,5,6],
[7,8,9],
[3,2,1]
])
withoutRow(arr, [1,2,3])
输出:
array([[1, 2, 3],
[3, 2, 1]])
array([[4, 5, 6],
[7, 8, 9],
[3, 2, 1]])
array([[4, 5, 6],
[7, 8, 9]])
withoutRow
应该相当有效(尤其是与布尔索引相比),因为只有一个循环(在原始数组的行上),并且您只需要构造一个新数组(返回值)
无序版本
如果要删除具有匹配坐标的任何点,而不考虑坐标顺序,则可以使用:
def withoutRowUnordered(arr, badrow):
badset = set(badrow)
return np.array([row for row in arr if badset != set(row)])
withoutRowUnordered(arr, [1,2,3])
输出:
array([[1, 2, 3],
[3, 2, 1]])
array([[4, 5, 6],
[7, 8, 9],
[3, 2, 1]])
array([[4, 5, 6],
[7, 8, 9]])
你能用语言解释一下你将如何获得预期的输出吗?也许-
A[~(A!=[1,2,3])。全部(1)]
或A[(A=[1,2,3])。任何(1)]
都是通过复杂的代码进行的。你的问题是以任何顺序匹配给定的值吗?如果是这样,我建议您使用set操作,或者对临时变量中的值进行排序以进行比较。老实说,这听起来像是numpy.delete
的工作。您不可能比numpy.delete
更快地完成此操作。最可能的优化途径可能是重新构造计算以消除此操作,而不是加快此操作。