给定一个数组 A、错误的行索引和错误的列索引,是否可以使用切片来创建一个没有这些行或列的新数组?
可以使用 np.delete 完成如下操作:
import numpy as np
A=np.random.rand(20,16)
bad_col=np.arange(0,A.shape[1],4)[1:]
bad_row=np.arange(0,A.shape[0],4)[1:]
Anew=np.delete(np.delete(A,bad_row,0),bad_col,1)
print('old shape ',A.shape)
print('new shape ',Anew.shape)
我还知道可以使用切片从数组中选择某些列和行。但我想知道它是否可以用于排除某些列和行?如果不行,除了np.delete
这样做之外最好的方法是什么。
编辑:根据评论,可能无法使用切片。使用高级索引创建新数组怎么样?
可以使用以下代码完成,但速度很慢,需要寻找更快的替代方案:
good_col = [i for i in range(A.shape[1]) if i==0 or i % 4 != 0]
good_row=[ i for i in range(A.shape[0]) if i==0 or i % 4 != 0]
Anew2=A[good_row,:][:,good_col]
print('new shape ',Anew2.shape)
谢谢
如果不移动所有项(对于大型数组来说,这样做很慢)或创建新项,则无法删除数组中的项。没有其他解决方案。
在 Numba 或 Cython 中,你可以直接用一个操作创建一个新数组,而不是两个操作,因此对于大型数组来说,它应该快两倍。对于小型数组来说,它应该更快,因为 Numpy 函数对于小型数组有相当大的开销。
Numpy 视图要么是连续的,要么是步幅的。无法沿给定轴使用可变步幅。这是出于性能考虑而这样定义的。因此,如果您只想选择具有偶数 ID 的列和行,您可以这样做(因为可以为结果视图设置每个轴的恒定步幅)。但是,您不能选择所有 ID 不能被 4 整除的行/列(因为没有可以用恒定步幅构建的视图)。
请注意,如果您尝试通过创建新维度然后展平视图来作弊,那么 Numpy 将创建一个副本(因为没有其他方法)。