gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:13:26 25 4
gpt4 key购买 nike

我正在尝试获取数组 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 的任意两个元素不可能相等的假设总是成立

最佳答案

编辑

重读这个问题,我现在很确定 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 应该相当高效(尤其是与 bool 索引相比时),因为只有一个循环(在原始数组的行上),而且您只需要构造一个新数组(返回值)。

无序版本

如果你想删除任何具有匹配坐标的点而不考虑坐标的顺序,你可以改为使用:

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

关于python - 快速高效的数组切片避免删除操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49930830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com