【问题标题】:Indexing a numpy ndarray with a numpy ndarray用 numpy ndarray 索引 numpy ndarray
【发布时间】:2018-10-10 16:17:55
【问题描述】:

我正在做一个关于 iris 数据集的教程。在这个过程中,我发现了一段代码,我看不懂:

它由两个ndarrays组成:

iris.target_names 是一个带有目标变量标签的 numpy ndarray:

iris.target_names
>>> array(['setosa', 'versicolor', 'virginica'], dtype='<U10')

clf.predict(test[features]) 是一个带有我预测的编码数字的 numpy ndarray:

clf.predict(test[features])
>>> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
   1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2],
  dtype=int64)

以下代码为我的预测创建了一个带标签的 ndarray:

iris.target_names[clf.predict(test[features])]
>>> array(['setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 
'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa', 
'setosa', 'setosa', 'versicolor', 'versicolor', 'versicolor', 'versicolor',  
'versicolor', 'versicolor', (...), dtype='<U10')

我已经考虑了一段时间,但我不明白它是如何工作的。因为实际上我们通过一个包含三个以上元素的一维数组来索引一个包含三个元素的一维数组,对吧?这怎么行?

如果有人可以帮助我就这个主题提供一些提示,那就太好了。

谢谢,马库斯

【问题讨论】:

  • 您正在使用预测的类来索引回原始标签,因此0,1,2 被转换为target_names 数组中的序数位置以给出'setosa', 'versicolor', 'virginica'
  • 就像位置选择:-)

标签: python numpy scikit-learn labeling


【解决方案1】:

如果我们忽略整个机器学习方面并将其提炼成一个简化示例:

In[6]:
# our classes
classes=np.array(['a','b','c'])
# generate some random labels
predict= np.random.randint(0,3,10)
predict
Out[6]: array([0, 2, 1, 0, 2, 0, 1, 2, 1, 0])

现在,如果我们将 predict 数组作为 classes 上的掩码传递,我们会将 0,1,2 转换为数组中的序号位置:

In[7]
classes[predict]
Out[7]: 
array(['a', 'c', 'b', 'a', 'c', 'a', 'b', 'c', 'b', 'a'], 
      dtype='<U1')

当你看到这个简单的例子时,这里并没有发生什么神奇的事情

您也可以在较小的阵列上看到它:

In[8]:
classes[[1,0,2]]

Out[8]: 
array(['b', 'a', 'c'], 
      dtype='<U1')

所以实际上预测的类是按位置索引回类

在这里传递数组的长度无关紧要,您所做的只是为数组提供索引值,因此它会创建一个包含该索引处值的传入长度的新数组:

In[9]:
classes[[0,0,0,0]]

Out[9]: 
array(['a', 'a', 'a', 'a'], 
      dtype='<U1')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2018-02-15
    • 2015-12-13
    • 2015-09-14
    • 2011-05-02
    • 2022-10-04
    • 2016-01-15
    相关资源
    最近更新 更多