我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

这标题的写的,“一种某某某方式”,感觉像是在写论文了。苏南大叔在本文中描述一下python语言中,对numpy类型的数据做简单筛选的一种方式。特殊之处就在于用别的编程语言的思路来解释原理的话,就可能会觉得有些匪夷所思。这也就得益于numpy的特殊运算方式。

苏南大叔:以鸢尾花数据为例,描述一种numpy变量联动筛选数据的方式 - numpy联动筛选
以鸢尾花数据为例,描述一种numpy变量联动筛选数据的方式(图3-1)

苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的代码编程经验总结。本文测试环境: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

综合上述几个筛选数据的方式,就得出下面的代码例子。在这个代码中,变量ab是实体分离的,但是客观上存在着意义对应的逻辑关系。

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轴上的纵向数据。参考文章:

苏南大叔:以鸢尾花数据为例,描述一种numpy变量联动筛选数据的方式 - 范例一
以鸢尾花数据为例,描述一种numpy变量联动筛选数据的方式(图3-2)

筛选鸢尾花数据集demo

把上面的例子稍稍改动一下的话,就可以对鸢尾花数据进行处理了。当然,介于读取鸢尾花数据的方式方法太多,这里的代码就不包装符合大家的实际情况了。复制之后记得自行改装。

这里使用sklearndatasets里面的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))   # 第三种花的第二列数据

苏南大叔:以鸢尾花数据为例,描述一种numpy变量联动筛选数据的方式 - 鸢尾花数据demo
以鸢尾花数据为例,描述一种numpy变量联动筛选数据的方式(图3-3)

输出:

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经验文章,请点击下面的文章链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python