3

我正在尝试获取数组 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()

有没有办法以更快/更清洁的方式做到这一点?

PD A 的任何两个元素都不相等的假设始终成立

4

1 回答 1

1

编辑

重读这个问题,我现在很确定 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]])

我暂时保留原来的答案,以防万一我错了。

原始答案

订购版本

怎么样:

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([[4, 5, 6],
       [7, 8, 9],
       [3, 2, 1]])

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([[4, 5, 6],
       [7, 8, 9]])
于 2018-04-20T02:15:48.133 回答