简单数组列表与pyplot.p

2024-04-19 19:50:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难理解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内部发生了什么。你知道吗


Tags: and元素plotmatplotlibnpplt数组array
1条回答
网友
1楼 · 发布于 2024-04-19 19:50:52

仔细看看你在做什么:

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]])

你可以把这个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(3,)的1d numpy数组兼容),并将它们连接到一个列表中。结果与形状(2,3)的二维阵列相一致。“2”是因为我们将两个列表放入lst,而“3”是因为两个列表的长度都是3。你知道吗

因此,当您在上面创建lst2时,您所做的事情与此等价:

lst2 = [ [[1]], [[2]] ]

将两个嵌套的子列表放入一个数组兼容列表中,两个子列表都与shape(1,1)兼容。这意味着您将得到一个三维数组(根据嵌套最深层次上有三个开口括号的事实),其形状为(2,1,1)。同样,2来自于这样一个事实,即您有两个数组在里面,并且后面的维度来自于内容。你知道吗


真正的问题是你想做什么。首先,你的数据不应该是真正的形状(1,1)。在pyplot.plot最直接的应用程序中,您有1d数据集:一个用于绘图的x坐标,一个用于绘图的y坐标。为此,可以对x和y使用简单(平面)列表或1d数组。重要的是它们的长度相同。你知道吗

然后,当你将两者相对绘制时,你首先传递x坐标,然后传递y坐标。你的意思大概是

plt.plot(V2,W2)

在这种情况下,您将传递二维数组以进行绘图,并且不会看到传递类似的三维数组所导致的错误。然而,^{}的行为对于2d输入来说是非常重要的(两个数据集的列将被相对地绘制),并且您必须确保您确实希望将2d数组作为输入传递。但是您几乎不想将同一个对象作为前两个参数传递给pyplot.plot。你知道吗

相关问题 更多 >