使用numpy ndarray索引numpy ndarray

时间:2018-04-30 14:35:12

标签: python numpy scikit-learn labeling

我正在使用iris数据集进行教程。在这个过程中,我找到了一段我无法理解的代码:

它由两个ndarray组成:

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

我已经考虑了一段时间,但我不明白这是如何运作的。因为实际上我们用一个具有三个以上元素的一维数组来索引具有三个元素的一维数组,对吧?这怎么办?

如果有人可以帮我提一些关于这个话题的提示,那会很棒。

谢谢,马库斯

1 个答案:

答案 0 :(得分: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')