如果是性能问题,您可能想尝试(但我不确定)创建一个视图*,而不是使用 np.delete。您可以通过切片来实现,这应该是 inplace 操作:
import numpy as np
arr = np.array([[1, 2], [5, 6], [9, 10]])
arr = arr[(0, 2), :]
print(arr)
导致:
[[ 1 2]
[ 9 10]]
但是,这不会释放被排除行占用的内存。它可能会提高性能,但在内存方面,您可能会遇到相同或更糟的问题。另请注意,据我所知,没有办法通过排除进行索引(例如arr[~1] 会非常有用),这必然会使您花费资源来构建索引数组。
对于大多数情况,我认为其他用户给出的建议是:
arr = numpy.delete(arr, 1, 0)
,是最好的。在某些情况下,可能值得探索其他替代方案。
编辑: *这实际上是不正确的(感谢@user2357112)。花式索引不会创建视图,而是返回一个副本,如 documentation 所示(我应该在得出结论之前检查一下,对此感到抱歉):
Advanced indexing always returns a copy of the data (contrast with basic slicing that returns a view).
所以我不确定这个花哨的索引建议是否值得作为一个实际的建议,除非它对 np.delete 方法有任何性能提升(我会在机会出现时尝试验证,见EDIT2)。
EDIT2:我进行了一个非常简单的测试,以查看通过反对删除功能使用花式索引是否有任何性能提升。使用timeit(实际上是我第一次使用,但似乎每个 sn-p 的执行次数为 1 000 000,因此时间的最高数字):
import numpy as np
import timeit
def test1():
arr = np.array([[1, 2], [5, 6], [9, 10]])
arr = arr[(0, 2), :]
def test2():
arr = np.array([[1, 2], [5, 6], [9, 10]])
arr = np.delete(arr, 1, 0)
print("Equality test: ", test1() == test2())
print(timeit.timeit("test1()", setup="from __main__ import test1"))
print(timeit.timeit("test2()", setup="from __main__ import test2"))
结果如下:
Equality test: True
5.43569152576767
9.476918448174644
这代表了非常可观的速度增益。不过请注意,为精美的索引构建序列需要时间。值不值当然要看解决的问题了。