以鸢尾花数据为例,描述一种numpy变量联动筛选数据的方式
发布于 作者:苏南大叔 来源:程序如此灵动~这标题的写的,“一种某某某方式”,感觉像是在写论文了。苏南大叔在本文中描述一下python
语言中,对numpy
类型的数据做简单筛选的一种方式。特殊之处就在于用别的编程语言的思路来解释原理的话,就可能会觉得有些匪夷所思。这也就得益于numpy
的特殊运算方式。
苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的代码编程经验总结。本文测试环境:win10
,python@3110
,numpy@ 1.24.2
。
筛选数据方式一
import numpy as np
a = np.array(["blog", "name", "blog"])
print(a == "blog")
输出:
[ True False True]
筛选数据方式二
import numpy as np
a = np.array([list("技术博客"), list("苏南大叔")])
print(a)
输出:
[['技' '术' '博' '客']
['苏' '南' '大' '叔']]
然后进行筛选动作一:
print(a==list("技术博客"))
输出:
[[ True True True True]
[False False False False]]
筛选动作二:
print(a==list("博客"))
报错输出:
FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
筛选动作三:
print(a=="博客") # 全部输出False
print(a=="博") # 对应元素位置输出True
输出:
[[False False False False]
[False False False False]]
[[False False True False]
[False False False False]]
对比一下,这种多重的数组筛选输出就比较有意思。整体可以对比,输出全为true
。但是不能作为一半数组进行对比,目前报错。但是如果作为单个的字符进行对比,又是可以进行对比的。
筛选数据方式三
import numpy as np
a = np.array([list("技术博客"), list("苏南大叔"), list("字数相同")])
b = a[[0,1,2],1:3]
print(b)
输出:
[['术' '博']
['南' '大']
['数' '相']]
筛选数据方式四
import numpy as np
a = np.array([list("技术博客"), list("苏南大叔"), list("字数相同")])
b = a[[True, False, True], 1:3]
print(b)
输出:
[['术' '博']
['数' '相']]
显然,这里对于False
的情况没有输出,只输出了两条数据。很显然,numpy
筛选数据的方式不仅仅这些,所以这里就留个口子,待后续补充。
联动筛选数据demo
综合上述几个筛选数据的方式,就得出下面的代码例子。在这个代码中,变量a
和b
是实体分离的,但是客观上存在着意义对应的逻辑关系。
import numpy as np
a = np.array([list("技术博客"), list("苏南大叔"), list("字数相同")])
b = np.array(["blog", "name", "blog"])
print(a)
print(b)
###############################
c = a[b == "name", 0]
print(c)
c = a[[1], 0]
print(c)
c = a[[False,True,False], 0]
print(c)
###############################
d = a[b == "blog", :2]
print(d)
d = a[[0,2], :2]
print(d)
d = a[[True,False,True], :2]
print(d)
运算结果:
[['技' '术' '博' '客']
['苏' '南' '大' '叔']
['字' '数' '相' '同']]
['blog' 'name' 'blog']
['苏']
['苏']
['苏']
[['技' '术']
['字' '数']]
[['技' '术']
['字' '数']]
[['技' '术']
['字' '数']]
可以得出的结论是:numpy
类型变量,筛选的时候,第一个参数,指的是y轴上横向数据,第二个参数,指的是x轴上的纵向数据。参考文章:
筛选鸢尾花数据集demo
把上面的例子稍稍改动一下的话,就可以对鸢尾花数据进行处理了。当然,介于读取鸢尾花数据的方式方法太多,这里的代码就不包装符合大家的实际情况了。复制之后记得自行改装。
这里使用sklearn
的datasets
里面的load_iris()
(参数均默认),来获得待处理数据的。参考文章:
from sklearn import datasets
iris = datasets.load_iris()
# X = iris.data[:, :4] # 取特征
X = iris.data # 取特征
y = iris.target # 取分类
# print(X, type(X)) # <class 'numpy.ndarray>
# print(y, type(y)) # <class 'numpy.ndarray>
def get_data(_iris, _feature):
print(iris.target_names[_iris] + "-" + iris.feature_names[_feature])
return X[y == _iris, _feature]
print(get_data(0, 0)) # 第一种花的第一列数据
print(get_data(0, 1)) # 第一种花的第二列数据
print(get_data(0, 2)) # 第一种花的第三列数据
print(get_data(0, 3)) # 第一种花的第四列数据
print(get_data(2, 1)) # 第三种花的第二列数据
输出:
setosa-sepal length (cm)
[5.1 4.9 4.7 4.6 5. 5.4 4.6 5. 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1
5.7 5.1 5.4 5.1 4.6 5.1 4.8 5. 5. 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.
5.5 4.9 4.4 5.1 5. 4.5 4.4 5. 5.1 4.8 5.1 4.6 5.3 5. ]
setosa-sepal width (cm)
[3.5 3. 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 3.4 3. 3. 4. 4.4 3.9 3.5
3.8 3.8 3.4 3.7 3.6 3.3 3.4 3. 3.4 3.5 3.4 3.2 3.1 3.4 4.1 4.2 3.1 3.2
3.5 3.6 3. 3.4 3.5 2.3 3.2 3.5 3.8 3. 3.8 3.2 3.7 3.3]
setosa-petal length (cm)
[1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 1.5 1.6 1.4 1.1 1.2 1.5 1.3 1.4
1.7 1.5 1.7 1.5 1. 1.7 1.9 1.6 1.6 1.5 1.4 1.6 1.6 1.5 1.5 1.4 1.5 1.2
1.3 1.4 1.3 1.5 1.3 1.3 1.3 1.6 1.9 1.4 1.6 1.4 1.5 1.4]
setosa-petal width (cm)
[0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 0.2 0.2 0.1 0.1 0.2 0.4 0.4 0.3
0.3 0.3 0.2 0.4 0.2 0.5 0.2 0.2 0.4 0.2 0.2 0.2 0.2 0.4 0.1 0.2 0.2 0.2
0.2 0.1 0.2 0.2 0.3 0.3 0.2 0.6 0.4 0.3 0.2 0.2 0.2 0.2]
virginica-sepal width (cm)
[3.3 2.7 3. 2.9 3. 3. 2.5 2.9 2.5 3.6 3.2 2.7 3. 2.5 2.8 3.2 3. 3.8
2.6 2.2 3.2 2.8 2.8 2.7 3.3 3.2 2.8 3. 2.8 3. 2.8 3.8 2.8 2.8 2.6 3.
3.4 3.1 3. 3.1 3.1 3.1 2.7 3.2 3.3 3. 2.5 3. 3.4 3. ]
结束语
本文所描述的代码,特殊就特殊在运算的方式思路。和其它编程语言的类似需求相比,numpy
的代码逻辑更加简单。更多苏南大叔的python
经验文章,请点击下面的文章链接:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。