如何将数组中的值分配给一个(x,y)点

1 投票
1 回答
3858 浏览
提问于 2025-04-17 22:41

我有3600个x值和3600个y值,还有一个180x20的数组。我想把这些数据画成等高线图,并把第一个x值和第一个y值分别对应到数组的第一个值(A[0,0]),依此类推……我该怎么做呢?

我的想法是:

x,y = np.meshgrid(x,y)
plt.contourf(x,y,A)

但是出现了问题:TypeError: x的形状和z不匹配:发现(3600, 3600)而不是(180, 20)。我明白这个错误的意思,但不知道该怎么解决。

1 个回答

3

我觉得你对meshgrid的作用有点误解。听起来你其实只想用reshape

关于numpy.meshgrid的解释

举个例子,假设我们有一个5x5的“z”值网格:

import numpy as np
z = np.random.random((5,5))

还有一组用于行的x坐标和一组用于列的y坐标:

ny, nx = z.shape
x = np.linspace(5, 7, nx)
y = np.linspace(-2, 8, ny)

print '-----Z-----\n', z, '\n'
print '-----X-----\n', x, '\n'
print '-----Y-----\n', y, '\n'

到目前为止,我们得到了:

-----Z-----
[[ 0.70319561  0.0141277   0.17580355  0.20411183  0.81714624]
 [ 0.45093838  0.18241847  0.27477369  0.4881957   0.62157783]
 [ 0.83172549  0.75278372  0.64856436  0.76651935  0.0152465 ]
 [ 0.50908933  0.51557264  0.9975723   0.39579782  0.71333262]
 [ 0.58998339  0.59205064  0.42716255  0.14138964  0.38212301]]

-----X-----
[ 5.   5.5  6.   6.5  7. ]

-----Y-----
[-2.   0.5  3.   5.5  8. ]

numpy.meshgrid的作用是把这些一维的行和列坐标数组转换成与z形状相匹配的二维数组:

yy, xx = np.meshgrid(y, x)

print '-----XX----\n', xx, '\n'
print '-----YY----\n', yy, '\n'

这样就得到了:

-----XX----
[[ 5.   5.   5.   5.   5. ]
 [ 5.5  5.5  5.5  5.5  5.5]
 [ 6.   6.   6.   6.   6. ]
 [ 6.5  6.5  6.5  6.5  6.5]
 [ 7.   7.   7.   7.   7. ]]

-----YY----
[[-2.   0.5  3.   5.5  8. ]
 [-2.   0.5  3.   5.5  8. ]
 [-2.   0.5  3.   5.5  8. ]
 [-2.   0.5  3.   5.5  8. ]
 [-2.   0.5  3.   5.5  8. ]]

处理你手上的数据

如果我理解得没错,你的x和y数组各有3600个元素,而你的z数组是180x20的。 (注意180 * 20 == 3600)所以,我认为你手上的数据相当于:

yourx, youry = xx.flatten().tolist(), yy.flatten().tolist()

显然,你的数据要大得多,但如果我们扩展上面的例子,它看起来会像这样:

---yourx---
[5.0, 5.0, 5.0, 5.0, 5.0, 5.5, 5.5, 5.5, 5.5, 5.5, 6.0, 6.0, 6.0, 6.0, 6.0, 6.5, 6.5, 6.5, 6.5, 6.5, 7.0, 7.0, 7.0, 7.0, 7.0]

---youry---
[-2.0, 0.5, 3.0, 5.5, 8.0, -2.0, 0.5, 3.0, 5.5, 8.0, -2.0, 0.5, 3.0, 5.5, 8.0, -2.0, 0.5, 3.0, 5.5, 8.0, -2.0, 0.5, 3.0, 5.5, 8.0]

因此,你只需要把你的列表重新调整成与z相同形状的二维数组。例如:

print np.reshape(yourx, z.shape)

这样就得到了

[[ 5.   5.   5.   5.   5. ]
 [ 5.5  5.5  5.5  5.5  5.5]
 [ 6.   6.   6.   6.   6. ]
 [ 6.5  6.5  6.5  6.5  6.5]
 [ 7.   7.   7.   7.   7. ]]

换句话说,你想要的是:

plt.contourf(np.reshape(yourx, z.shape), np.reshape(youry, z.shape), z)

撰写回答