我很难理解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
内发生的事情。
答案 0 :(得分:0)
仔细看看你正在做什么:
V2 = np.array([[1]])
W2 = np.array([[2]])
lst2 = [V2, W2]
plt.plot(lst2, lst2)
由于一些奇怪的原因,您通过使用嵌套的括号对将数组定义为(1,1)
形状。构造lst2
时,您将沿新的前导维度堆叠数组。这与pyplot没什么关系,这是numpy。
Numpy数组是矩形的,它们与列表的列表列表兼容。嵌套级别决定了数组的维数。看一个简单的2D示例:
>>> M = np.arange(2*3).reshape(2,3)
>>> print(repr(M))
array([[0, 1, 2],
[3, 4, 5]])
您可以将所有意图和目的都视为两个行向量。 M[0]
与M[0,:]
相同,是第一行,M[1]
与M[1,:]
相同,是第二行。然后,您还可以通过以下方式从两行构造此数组:
row1 = [0, 1, 2]
row2 = [3, 4, 5]
lst = [row1, row2]
np.array(lst)
我的观点是我们采用了两个长度为3的平面列表(它们与形状为(3,)
的1d numpy数组兼容),并将它们连接在一个列表中。结果与形状(2,3)
的二维数组兼容。 " 2"是因为我们将2个列表放入lst
,而#34; 3"是因为这两个名单的长度均为3。
因此,当您在上面创建lst2
时,您正在做一些与此相同的事情:
lst2 = [ [[1]], [[2]] ]
您将两个嵌套的子列表放入阵列兼容列表中,并且这两个子列表都与形状(1,1)
兼容。这意味着您最终会得到一个3d数组(根据您在最深层嵌套时有三个左括号的事实),形状为(2,1,1)
。同样,2来自于内部有两个数组,并且尾随尺寸来自内容。
真正的问题是你正在尝试做什么。首先,您的数据不应该是真实的(1,1)。在pyplot.plot
的最简单的应用中,您有1d数据集:一个用于x,一个用于绘图的y坐标。为此,您可以为x和y使用简单(平面)列表或1d数组。重要的是它们的长度相同。
然后当你将两者相互绘制时,首先传递x坐标,然后传递第二个y坐标。你可能意味着类似
plt.plot(V2,W2)
在这种情况下,您可以通过2D阵列进行绘图,并且您不会看到通过传递类似3d数组的错误。但是,pyplot.plot
的行为对于2d输入来说并不重要(两个数据集的列将相互绘制),并且您必须确保确实要将2d数组作为输入传递。但是你几乎不想将前两个参数传递给pyplot.plot
。