我很难理解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
时构建的。你知道吗
我的问题是,当我们打电话的时候,幕后会发生什么pyplot.plot图(x,y)有x和y列表吗?看起来像是一个x元素的数组被构建(y也是如此)。这些数组必须有最大2个轴。我说的对吗?你知道吗
我知道如果我用努比。挤压在V2和W2上,它可以工作。但我想在我给出的例子中理解pyplot.plot
内部发生了什么。你知道吗
仔细看看你在做什么:
出于某种奇怪的原因,您使用一对嵌套的方括号将数组定义为
(1,1)
形状。当你构造lst2
时,你沿着一个新的前导维度来堆叠你的数组。这与pyplot无关,这是numpy。你知道吗Numpy数组是矩形的,它们与。。。列表列表。嵌套级别决定数组的维数。请看一个简单的2d示例:
你可以把这个2x3矩阵看作两个行向量。
M[0]
与M[0,:]
相同,是第一行,M[1]
与M[1,:]
相同,是第二行。然后还可以通过以下方式从这两行构造此数组:我的观点是,我们获取了两个长度为3的平面列表(与shape
(3,)
的1d numpy数组兼容),并将它们连接到一个列表中。结果与形状(2,3)
的二维阵列相一致。“2”是因为我们将两个列表放入lst
,而“3”是因为两个列表的长度都是3。你知道吗因此,当您在上面创建
lst2
时,您所做的事情与此等价:将两个嵌套的子列表放入一个数组兼容列表中,两个子列表都与shape
(1,1)
兼容。这意味着您将得到一个三维数组(根据嵌套最深层次上有三个开口括号的事实),其形状为(2,1,1)
。同样,2来自于这样一个事实,即您有两个数组在里面,并且后面的维度来自于内容。你知道吗真正的问题是你想做什么。首先,你的数据不应该是真正的形状(1,1)。在
pyplot.plot
最直接的应用程序中,您有1d数据集:一个用于绘图的x坐标,一个用于绘图的y坐标。为此,可以对x和y使用简单(平面)列表或1d数组。重要的是它们的长度相同。你知道吗然后,当你将两者相对绘制时,你首先传递x坐标,然后传递y坐标。你的意思大概是
在这种情况下,您将传递二维数组以进行绘图,并且不会看到传递类似的三维数组所导致的错误。然而,^{} 的行为对于2d输入来说是非常重要的(两个数据集的列将被相对地绘制),并且您必须确保您确实希望将2d数组作为输入传递。但是您几乎不想将同一个对象作为前两个参数传递给
pyplot.plot
。你知道吗相关问题 更多 >
编程相关推荐