使用模数
的方法#1
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])
使用掩码的方法#2:将需求作为“视图”
考虑到“视图”的要求,如果想要节省内存,我们可以在Linux系统上存储等效的布尔数组,这将占用8
倍更少的内存。因此,使用掩码的方法会像这样 -
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])
使用NumPy数组步幅
的第三种方法:将要求作为视图
如果输入数组的长度是n
的倍数,则可以使用np.lib.stride_tricks.as_strided
创建这样的视图。 如果不是倍数,则仍然可以工作,但不是安全的做法,因为我们将超出为输入数组分配的内存。 请注意,因此创建的视图将是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])
np.random.shuffle
来洗牌行。 - Ben Hazelwood