为了进行K折验证,我想对numpy数组进行切片,以便制作原始数组的视图,但删除第n个元素。
例如:[0、1、2、3、4、5、6、7、8、9]
如果n = 4,则结果为[1、2、4、5、6、8、9]
注意:numpy的要求是因为它用于固定依赖关系的机器学习分配。
方法#1modulus
modulus
a[np.mod(np.arange(a.size),4)!=0]
样品运行-
In [255]: a Out[255]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) In [256]: a[np.mod(np.arange(a.size),4)!=0] Out[256]: array([1, 2, 3, 5, 6, 7, 9])
方法2masking:view
masking
view
考虑到视图的需求,如果要节省内存,我们可以存储等效的布尔数组,该数组将8在Linux系统上占用更少的内存。因此,这种基于掩码的方法将像这样-
8
# Create mask mask = np.ones(a.size, dtype=bool) mask[::4] = 0
这是内存需求统计信息-
In [311]: mask.itemsize Out[311]: 1 In [312]: a.itemsize Out[312]: 8
然后,我们可以使用布尔索引作为视图-
In [313]: a Out[313]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) In [314]: a[mask] = 10 In [315]: a Out[315]: array([ 0, 10, 10, 10, 4, 10, 10, 10, 8, 10])
方法#3的NumPy array strides要求:view
NumPy array strides
np.lib.stride_tricks.as_strided给定输入数组的长度是的倍数,您可以用来创建这样的视图n。如果不是倍数,它仍然可以工作,但不是安全的做法,因为我们将超出为输入数组分配的内存。请注意,这样创建的视图将是2D。
np.lib.stride_tricks.as_strided
n
2D
因此,获得这种观点的实现将是-
def skipped_view(a, n): s = a.strides[0] strided = np.lib.stride_tricks.as_strided return strided(a,shape=((a.size+n-1)//n,n),strides=(n*s,s))[:,1:]
In [50]: a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) # Input array In [51]: a_out = skipped_view(a, 4) In [52]: a_out Out[52]: array([[ 1, 2, 3], [ 5, 6, 7], [ 9, 10, 11]]) In [53]: a_out[:] = 100 # Let's prove output is a view indeed In [54]: a Out[54]: array([ 0, 100, 100, 100, 4, 100, 100, 100, 8, 100, 100, 100])