NumPy第四章-数学函数及逻辑函数

逻辑函数

真值测试
numpy.all() 用于判断整个数组中的元素的值是否全部满足条件,如果满足条件返回True,否则返回False。
numpy.any() 任意一个元素为True,输出为True

import numpy as np
a2 = np.arange(5)       # 生成一个矩阵 [0  1  2  3  4]
print("np.all(a2):", np.all(a2))    # 输出:False
print("np.any(a2):", np.any(a2))    # 输出:True

numpy.isnan 判断是否为空

a=np.array([1,2,np.nan])
print(np.isnan(a))
#[False False  True]

逻辑运算
np.logical_and (逻辑与)
np.logical_or (逻辑或)
np.logical_not (逻辑非)

np.logical_and(True, False)
#False
np.logical_and([True, False], [False, False])
#array([False, False], dtype=bool)

对照函数
np.greater(x, 2) x中大于2的值
np.greater_equal(x, 2) x中大于或者等于2的值
np.equal(x, 2)
np.not_equal(x, 2)
np.less(x, 2)
np.less_equal(x, 2)

x = np.array([1, 2, 3, 4, 5, 6, 7, 8])

y = x > 2
print(y)
print(np.greater(x, 2))
# [False False  True  True  True  True  True  True]

y = x >= 2
print(y)
print(np.greater_equal(x, 2))
# [False  True  True  True  True  True  True  True]

y = x == 2
print(y)
print(np.equal(x, 2))
# [False  True False False False False False False]

y = x != 2
print(y)
print(np.not_equal(x, 2))
# [ True False  True  True  True  True  True  True]

y = x < 2
print(y)
print(np.less(x, 2))
# [ True False False False False False False False]

y = x <= 2
print(y)
print(np.less_equal(x, 2))
# [ True  True False False False False False False]

numpy.isclose比较两个array是不是每一元素都相等,默认在1e-05的误差范围内
numpy.allclose与numpy.isclose相同,区别在于numpy.isclose输出a,b两个数组每个位置判断的bool值,而numpy.allclose输出的是a,b两个数组整体的判断结果

数学函数

向量化
有了向量化,编写代码时无需使用显式循环

广播
在算术运算期间处理具有不同形状的数组,让较小的数组在较大的数组上“广播”,以便它们具有兼容的形状。
广播的规则:

  • 如果两个数组的维度数dim不相同,那么小维度数组的形状将会在左边补1。
  • 如果shape维度不匹配,但是有维度是1,那么可以扩展维度是1的维度匹配另一个数组;
  • 如果shape维度不匹配,但是没有任何一个维度是1,则匹配引发错误;

二维数组加一维数组

import numpy as np

x = np.arange(4)
y = np.ones((3, 4))
print(x.shape)  # (4,)   x为[0. 1. 2. 3]
print(y.shape)  # (3, 4)

print((x + y).shape)  # (3, 4)
print(x + y)
# [[1. 2. 3. 4.]
#  [1. 2. 3. 4.]
#  [1. 2. 3. 4.]]

两个数组均需要广播

x = np.arange(4).reshape(4, 1)
y = np.ones(5)
#x为[[0] [1] [2] [3]]
#y为[1. 1. 1. 1. 1.]
print(x.shape)  # (4, 1) 
print(y.shape)  # (5,) 只有一维5个数的意思

print((x + y).shape)  # (4, 5)
print(x + y)
# [[1. 1. 1. 1. 1.]
#  [2. 2. 2. 2. 2.]
#  [3. 3. 3. 3. 3.]
#  [4. 4. 4. 4. 4.]]

算术运算
加减乘除
numpy.add(x1, x2, *args, **kwargs)
numpy.subtract(x1, x2, *args, **kwargs)
numpy.multiply(x1, x2, *args, **kwargs)
numpy.divide(x1, x2, *args, **kwargs)
numpy.floor_divide(x1, x2, *args, **kwargs) 对x1/x2向下取整
numpy.power(x1, x2, *args, **kwargs) x1的x2次方
numpy.sqrt(x, *args, **kwargs) 开根号
numpy.square(x, *args, **kwargs) 平方
注意乘方的运算规则

三角函数
numpy.prod 乘积
numpy.cumprod 累乘
numpy.diff 差值
numpy.around 舍入
numpy.ceil 上限
numpy.floor 下限

import numpy as np

x = np.random.rand(3, 3) * 10
print(x)
# [[0.67847795 1.33073923 4.53920122]
#  [7.55724676 5.88854047 2.65502046]
#  [8.67640444 8.80110812 5.97528726]]

y = np.ceil(x)
print(y)
# [[1. 2. 5.]
#  [8. 6. 3.]
#  [9. 9. 6.]]

y = np.floor(x)
print(y)
# [[0. 1. 4.]
#  [7. 5. 2.]
#  [8. 8. 5.]]

numpy.clip 裁剪

import numpy as np

x = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 35]])
y = np.clip(x, a_min=20, a_max=30)   #小于20的用20替换,大于30的用30替换
print(y)
# [[20 20 20 20 20]
#  [20 20 20 20 20]
#  [21 22 23 24 25]
#  [26 27 28 29 30]
#  [30 30 30 30 30]]

numpy.absolute 绝对值
numpy.sign 返回数字符号的逐元素指示 数学中的sign()函数
在这里插入图片描述

x = np.arange(-5, 5)
print(x)
#[-5 -4 -3 -2 -1  0  1  2  3  4]
print(np.sign(x))
#[-1 -1 -1 -1 -1  0  1  1  1  1]

练习

1,将数组a中大于30的值替换为30,小于10的值替换为10。
方法一:np.clip
方法二:np.where

import numpy as np
np.random.seed(100)
a = np.random.uniform(1, 50, 20)
print(a)
# [27.63 14.64 21.8  42.39  1.23  6.96 33.87 41.47  7.7  29.18 44.67 11.25
#  10.08  6.31 11.77 48.95 40.77  9.43 41.   14.43]

# 方法1
b = np.clip(a, a_min=10, a_max=30)
print(b)
# [27.63 14.64 21.8  30.   10.   10.   30.   30.   10.   29.18 30.   11.25
#  10.08 10.   11.77 30.   30.   10.   30.   14.43]

# 方法2
b = np.where(a < 10, 10, a)
b = np.where(b > 30, 30, b)
print(b)
# [27.63 14.64 21.8  30.   10.   10.   30.   30.   10.   29.18 30.   11.25
#  10.08 10.   11.77 30.   30.   10.   30.   14.43]

2,如何找到局部极大值的坐标,或峰值

np.diff() 沿着指定轴计算差值

import numpy as np

a = np.array([1, 3, 7, 1, 2, 6, 0, 1])
b1 = np.diff(a)
b2 = np.sign(b1)
b3 = np.diff(b2)

print(b1)  # [ 2  4 -6  1  4 -6  1]
print(b2)  # [ 1  1 -1  1  1 -1  1]
print(b3)  # [ 0 -2  2  0 -2  2]  
#等于-2处为极大值,为2处为极小值,0处在单增加或者单减少
index = np.where(np.equal(b3, -2))[0] + 1
print(index) # [2 5]

3,对矩阵做归一化

归一化: (x - min) / (max - min)

Z = np.random.random((5,5))
Zmax, Zmin = Z.max(), Z.min()
Z = (Z - Zmin)/(Zmax - Zmin)
print(Z)

4,提取整数部分
np.floor() 向下取整
np.ceil() 向上取整
np.trunc/fix(a) 截取整数部分
在这里插入图片描述

Z = np.random.uniform(0,10,10)

print (Z - Z%1)
print (np.floor(Z))
print (np.ceil(Z)-1)
print (Z.astype(int))
print (np.trunc(Z))

平均数为:np.mean(arr1))
中位数为:np.median(arr1))
方差为:%np.var(arr1))
标准差为:np.std(arr1))
相关性矩阵为:np.cov(arr1,arr2))
协方差矩阵为:np.corrcoef(arr1,arr2)

4,从数组中提取满足给定范围内的所有元素
获取5-10之间的元素

import numpy as np

a = np.array([2, 6, 1, 9, 10, 3, 27])
mask = np.logical_and(np.greater_equal(a, 5), np.less_equal(a, 10))

# 方法1
x = np.where(mask)
print(a[x])  # [ 6  9 10]

# 方法2
x = np.nonzero(mask)
print(a[x])  # [ 6  9 10]

# 方法3
x = a[np.logical_and(a >= 5, a <= 10)]
print(x)  # [ 6  9 10]

5,找出数组中与给定值最接近的数
np.argmin()用于检索数组中最小值的位置,并返回其下标

Z=np.array([[0,1,2,3],[4,5,6,7]])
print(Z)
z=5.1
np.abs(Z - z).argmin()
print(Z.flat[np.abs(Z - z).argmin()])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值