【问题标题】:numpy contour: TypeError: Input z must be a 2D arraynumpy 轮廓:TypeError:输入 z 必须是二维数组
【发布时间】:2016-03-10 20:18:51
【问题描述】:

我有列表格式的数据。

看起来像这样:

[(x_1, y_1, Z_1),...(x_i, y_j, z_k),...(x_p, y_q, z_r)]

对于每个 x 和 y,都有一个 z。 X、Y、Z的长度分别为p、q、r(=p*q)。

我打算绘制一个以 X 和 Y 为网格,Z 为要绘制的值的等高线图。

我有以下代码(仅代表):

import csv
import sys
import statistics
import numpy as np
from scipy.interpolate import UnivariateSpline
from matplotlib import pyplot as plt
...........

#format of data = [(x, y, z)......]

#x, y, z are lists

X = [X1,..........,Xp] #length, p 

Y = [Y1,..........,Yq] #length, q

Z = [Z1,..........,Zpq] #length, pq

#np.mesh

X1, Y1 = np.meshgrid(X, Y)

plt.figure()
CS = plt.contour(X1, Y1, Z)
plt.clabel(CS, inline=1, fontsize=10)

我收到以下错误:

Traceback (most recent call last):
  File "C:/Users/uname/PycharmProjects/waferZoning/contour.py", line 49, in <module>
    CS = plt.contour(X1, Y1, Z)
  File "C:\Users\uname\AppData\Local\Programs\Python\Python35\lib\site-packages\matplotlib\pyplot.py", line 2766, in contour
    ret = ax.contour(*args, **kwargs)
  File "C:\Users\uname\AppData\Local\Programs\Python\Python35\lib\site-packages\matplotlib\__init__.py", line 1811, in inner
    return func(ax, *args, **kwargs)
  File "C:\Users\uname\AppData\Local\Programs\Python\Python35\lib\site-packages\matplotlib\axes\_axes.py", line 5640, in contour
    return mcontour.QuadContourSet(self, *args, **kwargs)
  File "C:\Users\uname\AppData\Local\Programs\Python\Python35\lib\site-packages\matplotlib\contour.py", line 1428, in __init__
    ContourSet.__init__(self, ax, *args, **kwargs)
  File "C:\Users\uname\AppData\Local\Programs\Python\Python35\lib\site-packages\matplotlib\contour.py", line 873, in __init__
    self._process_args(*args, **kwargs)
  File "C:\Users\uname\AppData\Local\Programs\Python\Python35\lib\site-packages\matplotlib\contour.py", line 1445, in _process_args
    x, y, z = self._contour_args(args, kwargs)
  File "C:\Users\uname\AppData\Local\Programs\Python\Python35\lib\site-packages\matplotlib\contour.py", line 1532, in _contour_args
    x, y, z = self._check_xyz(args[:3], kwargs)
  File "C:\Users\uname\AppData\Local\Programs\Python\Python35\lib\site-packages\matplotlib\contour.py", line 1566, in _check_xyz
    raise TypeError("Input z must be a 2D array.")
TypeError: Input z must be a 2D array.

我明白错误是什么,但我无法纠正它。

我不能给出 MWE,但我想我已经把我的问题说得很清楚了。

https://www.dropbox.com/s/33jmfcjzikl4w5g/contour_synthetic.txt?dl=0

【问题讨论】:

    标签: python-3.x numpy scipy contour


    【解决方案1】:

    你需要有一个z,其长度等于xy的长度的乘积:

    assert len(z) == (len(x) * len(y))
    

    z 设为二维数组:

    z = np.array(z)
    z = z.reshape((len(x), len(y)))
    

    这里是一个 MCVE:

    x = np.arange(5)
    y = np.arange(5)
    z = np.arange(25).reshape(5, 5)
    x1, y1 = np.meshgrid(x, y)
    plt.contour(x1, y1, z)
    

    确保您的数据是这样的结构。

    【讨论】:

    • 在我的回答中添加了注释。您的 Z 似乎没有合适的长度。我假设Zpq 表示Xp * Xq
    • 嗨,迈克,请检查我在问题中添加的新更新。它应该使事情变得更清楚。我知道 Z 需要是一个网格数组。我现在不知道如何从一维数组创建一个二维数组。谢谢!
    • 嗨,迈克,我一直在尝试按照您的建议将我的数据排列在网格中,但是由于有将近 5000 个条目,因此很难手动完成。我现在在我的问题中附加了一个文件,其中包含一些随机生成的数据以提供一个想法。感谢您的帮助。
    • 这些是随机数据。您需要先将它们网格化。看看scipy.interpolate.griddata
    • 是的,我同时阅读了一些提到这一点的答案。我将尝试实现这一点。再次感谢您!
    猜你喜欢
    • 2015-10-27
    • 2013-07-11
    • 2019-08-30
    • 1970-01-01
    • 2017-12-20
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多