numpy AttributeError:'list'对象没有属性'ravel'

2guxujil  于 2023-11-18  发布在  其他
关注(0)|答案(2)|浏览(165)

下面的代码块继续返回相同的错误,我不明白为什么......有帮助吗?我已经将numpy导入为np并定义了xx1和xx2,但代码仍然返回错误。是什么导致了这个问题?

def plot_decision_regions(X,y,classifier,resolution=0.02):
    markers = ('s','x','o','^','v')
    colors = ('red','blue','lightgreen','gray','cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])
    x1_min = X[:,0].min() -1
    x1_max = X[:,0].max() +1
    x2_min = X[:,1].min() -1
    x2_max = X[:,1].max() +1
    xx1 = np.meshgrid(np.arange(x1_min,x1_max,resolution))
    xx2 = np.meshgrid(np.arange(x2_min,x2_max,resolution))
    Z = classifier.predict(np.array([xx1.ravel(),xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1,xx2,Z,alpha=0.3,cmap=cmap)
    plt.xlim(xx1.min(),xx1.max())
    plt.ylim(xx2.min(),xx2.max())
    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y==cl,0],y=X[y==cl,1],alpha=0.8,c=colors[idx],marker=markers[idx],label=cl,edgecolor='black')

        
>>> plot_decision_regions(X,y,classifier=ppn)

个字符

6kkfgxo0

6kkfgxo01#

np.meshgrid()的返回值是一个列表。
从坐标向量返回坐标矩阵的列表。
Source .)
然后xx1和xx2是列表,你得到这个错误。
可以使用np.array()将列表转换为数组。

gpfsuwkq

gpfsuwkq2#

调试时最好的两个朋友是numpydocs和交互式测试环境
这些线路是:

xx1 = np.meshgrid(np.arange(x1_min,x1_max,resolution))
xx2 = np.meshgrid(np.arange(x2_min,x2_max,resolution))
np.array([xx1.ravel(),xx2.ravel()]).T

字符串
让我们用一个简单的范围来做arange。我不会讨论如何选择最小值和最大值。但是要小心使用像0.02这样的分数步长。端点处理可能是不可预测的,因此arange. arange中的实际元素数量会警告这一点。

In [205]: xx1 = np.meshgrid(np.arange(0,10))    
In [206]: xx1
Out[206]: [array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])]    
In [207]: xx1.ravel()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[207], line 1
----> 1 xx1.ravel()

AttributeError: 'list' object has no attribute 'ravel'


正如meshgrid告诉我们的那样,结果是list,列表没有ravel。你清楚为什么要使用meshgridravel吗?一个简单的arange就足够了。
通常情况下,meshgrid用于2个或多个数组。仅用于一个数组几乎没有什么好处。

In [208]: xx1 = np.arange(0,10)


现在让我们尝试在最后一行创建数组(使用另一个xx1代替xx2):

In [209]: np.array([xx1,xx1]).T
Out[209]: 
array([[0, 0],
       [1, 1],
       [2, 2],
       [3, 3],
       [4, 4],
       [5, 5],
       [6, 6],
       [7, 7],
       [8, 8],
       [9, 9]])


注意,如果xx2有不同的长度-我还没有看最小/最大值是否做任何事情来控制长度。加上我前面提到的分数step问题。

In [210]: xx2 = np.arange(0,8)    
In [211]: np.array([xx1,xx2]).T
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[211], line 1
----> 1 np.array([xx1,xx2]).T

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (2,) + inhomogeneous part.


这个错误消息有点晦涩,但它是处理“不规则”数组的长序列中的最新一个。numpy不能从长度不同的数组中生成数字dtype数组。
同样,我不知道你的总体目标是什么,但这应该有助于隔离在构造一个数组以提供给分类器时的潜在问题。

相关问题