python - 用 numpy ndarray 索引 numpy ndarray
问题描述
我正在做一个关于 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')
我已经考虑了一段时间,但我不明白这是如何工作的。因为实际上我们通过一个包含三个以上元素的一维数组来索引一个包含三个元素的一维数组,对吧?这怎么行?
如果有人可以帮助我就这个主题提供一些提示,那就太好了。
谢谢,马库斯
解决方案
如果我们忽略整个机器学习方面并将其提炼成一个简化的例子:
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')
推荐阅读
- r - 使用基于属性的布局从数据框创建图形
- c# - 如何在调用方法中获得 CA2100 SQL 注入警告
- swiftui - 在 SwiftUI 中更改 GroupBox 背景颜色
- ios - 在 Swift 中快速 UInt 到 Float 转换
- sql-server - 表更新因在 SQL Server 中的存在而受到影响
- php - 如何阻止除 Chromium 之外的所有 IE 和 Microsoft Edge
- amazon-web-services - MQTT.fx 无法连接到 AWS IoT (MqttException)
- javascript - 函数返回函数理解它为什么工作
- mysql - 一个日期的Mysql查询输出空白并且适用于另一个日期
- scala - Encoders.product[of a scala trait ].schema in spark