我在理解如何pyplot.plot
工作时遇到了一些麻烦。
我举一个简单的例子:我想绘制pyplot.plot(lst2, lst2)
lst2 是列表的位置。
困难在于 lst2 的每个元素都是一个形状为 (1,1) 的数组。如果元素是浮动的而不是数组,就不会有问题。
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
V2 = np.array([[1]])
W2 = np.array([[2]])
print('The shape of V2 is', V2.shape)
print('The shape of W2 is', W2.shape)
lst2 = [V2, W2]
plt.plot(lst2, lst2)
plt.show
以下是我收到的错误消息的结尾:
~\Anaconda3\lib\site-packages\matplotlib\axes\_base.py in _xy_from_xy(self,x, y)
245 if x.ndim > 2 or y.ndim > 2:
246 raise ValueError("x and y can be no greater than 2-D, but have "
--> 247 "shapes {} and {}".format(x.shape, y.shape))
248
249 if x.ndim == 1:
ValueError: x and y can be no greater than 2-D, but have shapes (2, 1, 1) and (2, 1, 1)
在错误消息中让我感到惊讶的是提到了一个维度 (2,1,1) 的数组。这似乎是数组np.array([V2,W2])
时,我们称之为建成pyplot.plot
。
我的问题是,当我们使用 x 和 y 列表调用 pyplot.plot(x,y) 时,幕后会发生什么?似乎构建了一个包含 x 元素的数组(对于 y 也是如此)。并且这些阵列必须有最多 2 个轴。我对么?
我知道如果我在 V2 和 W2 上使用 numpy.squeeze,它会起作用。但是我想了解pyplot.plot
在我给出的示例中发生了什么。
仔细看看你在做什么:
V2 = np.array([[1]])
W2 = np.array([[2]])
lst2 = [V2, W2]
plt.plot(lst2, lst2)
出于某种奇怪的原因,您(1,1)
通过使用一对嵌套的括号将数组定义为形状。构造时lst2
,您沿新的前导维度堆叠数组。这与 pyplot 无关,这是 numpy。
Numpy 数组是矩形的,它们与列表的列表兼容 ... of 列表。嵌套的级别决定了数组的维数。看一个简单的二维示例:
>>> M = np.arange(2*3).reshape(2,3)
>>> print(repr(M))
array([[0, 1, 2],
[3, 4, 5]])
出于所有意图和目的,您可以将此 2x3 矩阵视为两个行向量。M[0]
是一样的M[0,:]
,并在第一行,M[1]
是相同的M[1,:]
是在第二排。然后,您还可以通过以下方式从两行构造此数组:
row1 = [0, 1, 2]
row2 = [3, 4, 5]
lst = [row1, row2]
np.array(lst)
我的观点是我们采用了两个长度为 3 的平面列表(它们与 shape 的一维 numpy 数组兼容(3,)
),并将它们连接到一个列表中。结果与 shape 的二维数组兼容(2,3)
。“2”是由于我们将 2 个列表放入 中lst
,而“3”是由于两个列表的长度均为 3。
因此,当您lst2
在上面创建时,您正在做一些与此等效的事情:
lst2 = [ [[1]], [[2]] ]
您将两个嵌套的子列表放入一个与数组兼容的列表中,并且两个子列表都与 shape 兼容(1,1)
。这意味着你最终会得到一个 3d 数组(根据你在嵌套的最深层次有三个左括号的事实),形状为(2,1,1)
。同样,2 来自内部有两个数组的事实,尾随维度来自内容。
真正的问题是你想要做什么。一方面,您的数据不应该真正具有形状 (1,1)。在最直接的应用程序中,pyplot.plot
您有 1d 数据集:一个用于 x ,另一个用于绘图的 y 坐标。为此,您可以对 x 和 y 使用简单(平面)列表或一维数组。重要的是它们的长度相同。
然后,当您将两者相互绘制时,首先传递 x 坐标,然后传递 y 坐标。你大概的意思是这样的
plt.plot(V2,W2)
在这种情况下,您将传递 2d 数组进行绘图,并且您不会看到传递类似 3d 数组的错误。但是,pyplot.plot
对于 2d 输入(两个数据集的列将相互绘制), 的行为并不重要,并且您必须确保您确实希望将 2d 数组作为输入传递。但是您几乎从不想将与前两个参数相同的对象传递给pyplot.plot
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句