Python 科学运算 | 形状与跨度元组

numpy的核心数据结构是它的多维数组对象 numpy.ndarray.

使用 ndarray 表示多维数据结构时, 从左到右的数组对应由表及里的维度, 或称为轴.

1
2
3
4
5
6
7
8
foo = np.array([
[ 0+1.j, 4+0.j, 5+1.j ],
[ 4+0.j, 3+1.j, 2+2.j ],
[ 1-5.j, 2-3.j, 6-0.j ]
])
print(foo.dtype)
print(foo.shape)
print(foo.strides)

dtype表示ndarray中每个元素的数据类型, 这里是 complex128, 使用16个字节表示.

shape 表示每个维度的size, 这里结果是 (3,3)

strides 表示在某一个维度下获取到下一个元素所需要跨过的字节数, 在轴0跨越一个元素包括3个complex128的数, 所以是 3*16=48, 在轴1 跨过一个元素相当于 1 个 complex128, 所以是16. 故结果tuple为 (48, 16)

事实上, 单个元素所需字节数 size, 形状元组 shape 和跨度元组 strides 三者之间有如下关系

1
strides = tuple(shape[1:]*size, size)

明白了原理之后, 下面布置一道练习题:

练习题 Py1

将多元数组 A 转化为 \(2 \times 2 \times 2 \times 3\) 的分块矩阵.

1
2
3
4
5
6
A = np.array([
[1, 1, 1, 5, 5, 5],
[1, 1, 1, 5, 5, 5],
[4, 4, 4, 6, 6, 6],
[4, 4, 4, 6, 6, 6]
])
1
2
3
4
5
6
7
8
9
10
11
12
13
>>>print(B)
[[[[1 1 1]
[1 1 1]]

[[5 5 5]
[5 5 5]]]


[[[4 4 4]
[4 4 4]]

[[6 6 6]
[6 6 6]]]]

答案点这里

博客中的练习题解答 $\lambda$ 邪教 | Haskell 语言基础

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×