带有pyplot.plot的简单数组列表

时间:2018-01-07 13:45:37

标签: python arrays numpy matplotlib plot

我很难理解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内发生的事情。

1 个答案:

答案 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