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.]]
"""
posted @ 2025-03-12 16:34  BigSun丶  阅读(68)  评论(0)    收藏  举报