用法
ndarray.strides: 跨越数组各个维度所需要经过的字节数元组
a = np.array([[10,2,4],[3, 4,11]],dtype=np.int32)
print(a.strides) #(12,4) 12表示在内存中a[n, 0]到a[n+1, 0]跨过多少byte; 4表示在内存中a[n, 0]到a[n, 1]跨过多少byte
# 查看数组a所有元素占用内存大小,单位byte
print(a.nbytes) # 24
# 查看数组a每个元素占用内存大小,单位byte
print(a.itemsize) # 4
print(a[:,1]) # [2 4]
print(a[:,1].strides) # (12,)
stride, = a[:,1].strides
print(stride) # 12
数组a以24(6个值*4=24)个字节的形式存储在内存中,一个接一个(又称为连续内存块)。数组的步幅告诉我们要沿着某个轴移到下一个位置,我们必须在内存中跳过多少个字节。
解释:
基础:
- 1byte = 8bit
- 不同数据类型占据的内存大小不同,总的来说一个32位的类型需要4byte,64位的类型需要8byte,可参考下表
| 数值 \ 数值类型 (单位:Byte) | int32 | int64 | float32 | float64 |
|–|--|–|--|–|
| [] | 96 | 96 | 96 | 96 |
| 1 | 4 | 8 | 4 | 8 |
表格意思:一个空的数组[]就占用内存96byte,因为它存放了关于数组大小等信息。32位的数组一个元素占用4byte,64的数组,一个元素占用8byte
计算规则:
- 跨越第1维:从a[x,0]到a[x,1]经过4个字节(1个值)才能移至下一列
- 跨越第0维:从a[0,x]到a[1,x]的话,需要经过12(3个值x4)个字节才能移至下一行中的相同位置,因为a[0],也就是a的一行有3个数据,占据12个字节
- 因此数组a的步幅将为(12, 4)
示例
y = np.reshape(np.arange(2*3*4), (2,3,4))
print(y)
print(y.strides) # (48, 16, 4)