2022.1.24 Notes
搞错重点了,不是 meshgrid 传参顺序问题,而是 ravel
/ flatten
那里的问题,xx
、yy
的展平和 z
的 展平似乎不太一致,应该先将 z
转置一下,即 xx_flat, yy_flat, = xx.ravel(), yy.ravel(), z.ravel()
换成 xx_flat, yy_flat, = xx.ravel(), yy.ravel(), z.T.ravel()
;而 meshgrid 的地方依然是 xx, yy = np.meshgrid(x, y)
,不掉转顺序传参。
在 [1] 中,当生成 (x, y) 位置时,用到 [numpy.meshgrid](https://numpy.org/doc/stable/reference/generated/numpy.meshgrid.html)。最初写的是: ```python xx, yy = np.meshgrid(x, y) ``` 但到实际使用时,发现这会使得图像中 x 和 y 调转了,应该反过来才对。 # Problem 在 [1] 中,由于 `bar3d` 传入的参数需要序列化为一维,所以需要位置、数据、颜色都**以同一种序遍历矩阵**,在 [1] 中体现为位置(`xx`、`yy`)、数据(`acc`)、颜色(`color_list`)都以 `ravel()` 展开(都换成 `flatten()` 应该也行)。
但是 meshgrid
生成的位置矩阵,会使得用 ravel()
展开之后,和数据不是同一种序。
test
import numpy as np
z = np.arange(16).reshape(4, 4)
print(z)
x = y = np.arange(4)
xx, yy = np.meshgrid(x, y) # 这里
print(xx)
print(yy)
# 对比:习惯遍历顺序、meshgrid 的顺序、反-meshgrid 顺序
for i in range(4):
for j in range(4):
_i, _j = xx[i][j], yy[i][j]
# 习惯、meshgrid、反-meshgrid
print(z[i][j], '\t', z[_i][_j], '\t', z[_j][_i])
# 同用 `ravel` 序列化
xx_flat, yy_flat, = xx.ravel(), yy.ravel(), z.ravel()
for i in range(16):
_x, _y = xx_flat[i], yy_flat[i]
# 习惯、meshgrid、反-meshgrid
print(z_flat[i], '\t', z[_x][_y], '\t', z[_y][_x])
- 输出,可以看出,第 3 列「反-meshgrid」的顺序才是和习惯遍历顺序一致,即行主序。
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]
[[0 0 0 0]
[1 1 1 1]
[2 2 2 2]
[3 3 3 3]]
0 0 0
1 4 1
2 8 2
3 12 3
4 1 4
5 5 5
6 9 6
7 13 7
8 2 8
9 6 9
10 10 10
11 14 11
12 3 12
13 7 13
14 11 14
15 15 15
0 0 0
1 4 1
2 8 2
3 12 3
4 1 4
5 5 5
6 9 6
7 13 7
8 2 8
9 6 9
10 10 10
11 14 11
12 3 12
13 7 13
14 11 14
15 15 15
OMG…(MG 指 meshgrid)
Solution
用展平时把meshgrid
时,把 x 和 y 反过来,即xx, yy = np.meshgrid(y, x)
或yy, xx = np.meshgrid(x, y)
。z
转置一下,即z.T.ravel()
。- 手写序列化,肯定对。