Python 快速高效的数组切片避免删除操作

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

我试图获取数组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,:] 
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
更快地完成此操作。最可能的优化途径可能是重新构造计算以消除此操作,而不是加快此操作。