numpy中数值的修改和比较运算
numpy中数值的修改和比较运算
- numpy中,同一个数值的整型不等于其浮点型数值,如 整型
10和浮点型10.,这个表达式10 == 10.的比较结果为false
一、简单改值
- 直接将取出的值、行、列重新进行赋值即可
import numpy as np # 约定俗成的一种命名
a = np.arange(24).reshape(4,6)
print(a)
print('*' * 20)
a[0] = 1 # 将第1行的值全部改为1
print(a)
a[:2,1:3] = 0 # 将第1行到第2行,第2到第3列数据 改为0
print(a)
print(a[2,3]) # 取第3行第4列的值
a[2,3] = 50 # 修改第3行第4列的值为50
print(a)
print(a[[1,2],[5,3]]) # 取(1,5) (2,3) 2个坐标的点
a[[1,2],[5,3]] *= 10 # 修改(1,5) (2,3) 2个坐标的值 乘以10
print(a)
"""
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
********************
[[ 1 1 1 1 1 1]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
[[ 1 0 0 1 1 1]
[ 6 0 0 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
15
[[ 1 0 0 1 1 1]
[ 6 0 0 9 10 11]
[12 13 14 50 16 17]
[18 19 20 21 22 23]]
[11 50]
[[ 1 0 0 1 1 1]
[ 6 0 0 9 10 110]
[ 12 13 14 500 16 17]
[ 18 19 20 21 22 23]]
"""
二、复杂改值
- 布尔改值
- numpy中的三元运算符
numpy.where() - numpy中的(裁剪)
ndarray.clip()
1. 布尔改值
- 需求:将数组中小于3的数据改为3
- 直接使用布尔索引改值即可
a = np.arange(24).reshape(4,6)
print(a)
print('*' * 30)
print(a<3)
print(a[a<3]) # 布尔取值
a[a<3] = 3 # 布尔改值
print(a)
"""
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
******************************
[[ True True True False False False]
[False False False False False False]
[False False False False False False]
[False False False False False False]]
[0 1 2]
[[ 3 3 3 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
"""
2. numpy中的三元运算符 numpy.where()
-
语法:
numpy.where(condition, x, y)- condition:表示条件,可以是数组或逻辑表达式。
- x:可选参数,表示满足条件的元素替换为
x中对应位置的元素。 - y:可选参数,表示不满足条件的元素替换为
y中对应位置的元素。
-
该函数是NumPy库中的一个非常有用的函数,主要用于根据给定的条件返回满足条件的元素的索引或进行值替换
- 当只提供一个参数时,
numpy.where()返回满足条件的元素坐标,坐标以元组的形式给出,通常原数组有多少维,输出的元组中就包含几个数组,分别对应符合条件元素的各维坐标 - 当提供三个参数时,
numpy.where()在条件满足时返回x,不满足时返回y
- 当只提供一个参数时,
-
需求:将数组中小于10的变为0,大于10的变为10
-
对于这种有两种需求的改值中,显然用上面的布尔索引改值也可以实现,但是麻烦
-
此时,有没有像是python中
a = 3 if 3<10 else 4类似的方法呢,这里numpy有个内置的numpy.where()方法就能实现 -
这个方法可以比较
nan 和 inf这两个数值,对于nan,任何数值(包括其本身)和它的比较都是false的结果,因为nan不等于任何值,对于inf,任何有限数都比它小,因为inf是正无穷大的意思,对于-inf,任何有限数都大于它
-
1. 正常数组的numpy.where()方法
a = np.arange(24).reshape(4,6)
print(a)
print('*' * 30)
a = np.where(a < 10, 0, 10) # 将a中小于10的变为0,大于10的变为10
print(a)
"""
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
******************************
[[ 0 0 0 0 0 0]
[ 0 0 0 0 10 10]
[10 10 10 10 10 10]
[10 10 10 10 10 10]]
"""
2. nan、inf的比较
print(s3)
s3 = np.where(s3 > 10, 0, 20)
print(s3)
s4 = np.where(s3 < 10, 0, 20)
print(s4)
"""
[[nan inf inf inf inf inf]
[inf inf inf inf inf inf]
[inf inf inf inf inf inf]
[inf inf inf inf inf inf]]
[[20 0 0 0 0 0]
[ 0 0 0 0 0 0]
[ 0 0 0 0 0 0]
[ 0 0 0 0 0 0]]
[[20 20 20 20 20 20]
[20 20 20 20 20 20]
[20 20 20 20 20 20]
[20 20 20 20 20 20]]
"""
3. numpy中的(裁剪)ndarray.clip()
- 需求:将小于10的变为10,大于20的变为20
- 显然用上面的布尔改值也行,但也是同样的问题,就是麻烦
- 此时,numpy中有个裁剪
clip()的方法 - 注意:这个方法无法替换
nan,对于inf这个数值,任何有限数都比它小
1. 正常数组的clip()方法
a = np.arange(24).reshape(4,6)
print(a)
print('*' * 30)
a = a.clip(10,20) # 将小于10的变为10,将大于20的变为20,其余的数据不变
print(a)
"""
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
******************************
[[10 10 10 10 10 10]
[10 10 10 10 10 11]
[12 13 14 15 16 17]
[18 19 20 20 20 20]]
"""
2. 对于 nan、inf的比较
print(s3)
s4 = s3.clip(10,20)
print(s4)
"""
[[nan inf inf inf inf inf]
[inf inf inf inf inf inf]
[inf inf inf inf inf inf]
[inf inf inf inf inf inf]]
[[nan 20. 20. 20. 20. 20.]
[20. 20. 20. 20. 20. 20.]
[20. 20. 20. 20. 20. 20.]
[20. 20. 20. 20. 20. 20.]]
"""

浙公网安备 33010602011771号