numpy meshgrid顺序问题

2022.1.24 Notes

搞错重点了,是 meshgrid 传参顺序问题,而是 ravel / flatten 那里的问题,xxyy 的展平和 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

  1. meshgrid 时,把 x 和 y 反过来,即 xx, yy = np.meshgrid(y, x)yy, xx = np.meshgrid(x, y) 展平时把 z 转置一下,即 z.T.ravel()
  2. 手写序列化,肯定对。

References

  1. matplotlib bar3d画3d柱状图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值