数据分析学习笔记(三)--numpy:内置函数(通用函数、数学与统计方法、集合)

通用函数

通用函数(ufunc)是一种对ndarray中对数据执行元素级运算的函数

# 例子数组
a = np.array([-1,2.1,0.2,2.6,9.1])  # [-1.   2.1  0.2  2.6  9.1]
b = np.arange(1,len(a)+1)           # [1 2 3 4 5]
  • 一元函数
函数说明例子结果
abs、fabs计算整数、浮点数和复数对绝对值,对于非复数值,可以使用更快对fabsnp.abs(a)[1. 2.1 0.2 2.6 9.1]
sqrt计算各元素的平方根,相当于 arr**0.5np.sqrt(b)
square计算各元素的平方,相当于 arr**2np.square(b)[ 1 4 9 16 25 36 49 64 81]
exp计算各元素的指数 e(x)
log、log10、log2、log1p分别为自然对数(底数为e)、底数为10的log、底数为2的log、log(1+x)
sign计算各元素的符号 ,1(正数)、0(零)、-1(负数)np.sign(a)[-1. 1. 1. 1. 1.]
ceil向上取整np.ceil(a)[-1. 3. 1. 3. 10.]
floor向下取整np.floor(a)[-1. 2. 0. 2. 9.]
rint四舍五入,保留dtypenp.rint(a)[-1. 2. 0. 3. 9.]
modf将元素的小数和整数部分以两个独立的数组形式返回np.modf(a)(array([-0. , 0.1, 0.2, 0.6, 0.1]), array([-1., 2., 0., 2., 9.]))
nonzero将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵np.nonzero(a)(array([0, 1, 2, 3, 4]),)
clip切除元素np.clip(a, 0, 5) 等同于 a.clip(0,5)[0. 2.1 0.2 2.6 5. ]
isnan返回一个布尔数组,True位置的元素为NaN值
isfinite、isinf返回一个布尔数组,True位置的元素为有穷的或者是无穷的
cos、conh、sin、sinh、tan、tanh普通型和双曲型三角函数
arccos、arccosh、arcsin、arcsinh、arctan、arctanh反三角函数
logical_not计算各元素not x的真值,相当于 -arr
  • 二元函数
函数说明例子结果
add相加np.add(a,b) 等同于 a+b[ 0. 4.1 3.2 6.6 14.1]
subtract第一个数组减第二个数组np.subtract(a,b) 等同于 a-b[-2. 0.1 -2.8 -1.4 4.1]
multiply相乘np.multiply(a,b) 等同于 a*b[-1. 4.2 0.6 10.4 45.5]
divide、floor_divide除法或做完除法后向下取整np.divide(a,b) 等同于 a/b;np.floor_divide(a,b) 等同于 np.floor(a/b)
powerpow(a,b),a的b次方np.power(a,b)
maximum、fmax元素中最大值,fmax会忽略NaNnp.maximum(a,b) 、np.fmax(a,b)
minimum、fmin元素中最小值,fmin会忽略NaN
mod求模np.mod(a,b)
copysign将第二个数组中的值的符号复制给第一个数组中的值np.copysign(b,a)[-1. 2. 3. 4. 5.]
greater、greater_equal、less、less_equal、equal、not_equal>、>=、<、<=、=、!=
logical_and、logical_or、logical_xor元素级的真值逻辑运算,相当于中缀运算符&、|、^

数学与统计方法

函数说明例子结果
sum对数组中全部或者某轴方向的元素求和np.sum(a) 或 a.sum()13.0
mean算术平均数,零长度的数组的mean为NaNnp.mean(a) 或 a.mean()2.6
average加权平均,权重相同时,也可看作时算术平均np.average(a)2.6
median中位数,一组有序数列的中间数,偶数时,取平均np.median(a)2.1
std、var分别求标准差和方差,自由度可调(默认为n)a.std()、a.var()3.4991427521608776、12.244
min、max最小值和最大值
argmin、argmax分别为最小元素和最大元素的索引a.argmin()、a.argmax()0、 4
diffdiff(a, n=1, axis=-1),后一个与前一个的差值,参数n表示进行n轮运算,多维数组中,可通过axis控制方向np.diff(a)[ 3.1 -1.9 2.4 6.5]
cumsum所有元素和累计和(数组)a.cumsum()[-1. 1.1 1.3 3.9 13. ]
cumprod所有元素的累计积(数组)np.cumprod()[-1. -2.1 -0.42 -1.092 -9.9372]

注:
上述例子是一维数组,如果是二维数组调用方法类似,不过可以使用参数 axis 指定方向,1为横向,0为竖向

arr = np.arange(24).reshape(4,6)
'''
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
 '''
# 求和
arr.sum()           # 276   总和
arr.sum(axis=0)     #  [36 40 44 48 52 56]
# 算术平均数
arr.mean()          # 11.5      总数的算术平均数
arr.mean(axis=1)    # [ 2.5  8.5 14.5 20.5] 竖向的算术平均数

关于加权平均数 : average函数

arr = np.arange(10).reshape(2,5)
'''
[[0 1 2 3 4]
 [5 6 7 8 9]]
 '''
arr.mean()          # 4.5 算术平均数 
np.average(arr)     # 4.5 可看作是算术平均数
np.average(arr, axis=1) # [2. 7.],给出了方向
np.average(arr, weights=np.arange(arr1.size).reshape(2,5))  # 传入了权重 6.333333333333333

集合

# 例子数组
s0 = np.array([1,2,3,2,1,4,5,2])    # [1 2 3 2 1 4 5 2]
s1 = np.arange(0,30,2)  # [ 0  2  4  6  8 10 12 14 16 18 20 22 24 26 28]
s2 = np.arange(0,30,3)  # [ 0  3  6  9 12 15 18 21 24 27]
函数说明例子结果
unique(x)计算x中唯一元素,并返回有序的结果np.unique(s0)[1 2 3 4 5]
intersect1d(x,y)交集,并返回有序结果np.intersect1d(s1,s2)[ 0 6 12 18 24]
union1d(x,y)并集,并返回有序结果np.union1d(s1,s2)[ 0 2 3 4 6 8 9 10 12 14 15 16 18 20 21 22 24 26 27 28]
setdiff1d(x,y)集合差,即元素在x中且不再y中np.setdiff1d(s1,s2)[ 2 4 8 10 14 16 20 22 26 28]
setxor1d(x,y)集合对称差,只存在x和y中的元素集合np.setxor1d(s1,s2)[ 2 3 4 8 9 10 14 15 16 20 21 22 26 27 28]
in1d(x,y)得到一个”x的元素是否包含于y”的布尔行数组np.in1d(s2,s1)[ True False True False True False True False True False]

注:数组1和数组2的元素数量及shape都可以不同
上述例子中的s1和s2虽然都是一维的,但是数量并不相同;为了验证集合操作无关shape,我们将s1和s2的shape做一下改变

s1 = s1.reshape(3,5)
'''
[[ 0  2  4  6  8]
 [10 12 14 16 18]
 [20 22 24 26 28]]
 '''
s2 = s2.reshape(2,5)
'''
[[ 0  3  6  9 12]
 [15 18 21 24 27]]
 '''
np.intersect1d(s1,s2)   # [15 18 21 24 27]]
np.union1d(s1,s2)       # [ 0  2  3  4  6  8  9 10 12 14 15 16 18 20 21 22 24 26 27 28]
np.setdiff1d(s2,s1)     # [ 3  9 15 21 27]

补充(where、sort、any、all)

  • where

    where函数是一个三目运算符,where(condition, x, y),
    完成类似下面的工作

ifcondition):
  x
else:
  y

例子1:有xarr和yarr两个数组,需要根据condition选择数据

xarr = np.array(np.arange(1.1, 1.6, 0.1))
yarr = np.array(np.arange(2.1, 2.6, 0.1))
cond = np.array([True, False, True, True, False])

在python语法中:

result = [x if c else y for x, y, c in zip(xarr, yarr, cond)]
输出:
[1.1, 2.2, 1.3000000000000003, 1.4000000000000004, 2.5000000000000004]
非常不方便,而且出现了数据异常问题

在numpy中使用where函数:

result = np.where(cond, xarr, yarr)
输出:
[1.1 2.2 1.3 1.4 2.5]

例子2:将arr数组中小于0的部分重制为0,其余部分保留

arr = np.random.randn(4,4)  
输出:
[[ 0.40336609 -1.42094364 -1.1257582   0.2787659 ]
 [-0.64618146 -0.56508989  0.20527747  1.8542685 ]
 [-0.39792887  0.94738928 -0.68713023  0.60328758]
 [-0.94495984 -1.47217366  0.03280616 -0.13120201]]
arr = np.where(arr>0, arr, 0)
输出:
[[0.40336609 0.         0.         0.2787659 ]
 [0.         0.         0.20527747 1.8542685 ]
 [0.         0.94738928 0.         0.60328758]
 [0.         0.         0.03280616 0.        ]]

例子3:复杂嵌套的情况

cond1 = np.array([True, False, True, True, False])
cond2 = np.array([True, True, True, False, False])
result = []

python语法:

for i in range(len(cond1)):
    if cond1[i] and cond2[i]:
        result.append(0)
    elif cond1[i]:
        result.append(1)
    elif cond2[i]:
        result.append(2)
    else:
        result.append(3)
print(result)           # [0, 2, 0, 1, 3]

在numpy中使用where函数:

result = np.where(cond1&cond2, 0 ,
             np.where(cond1, 1,
                  np.where(cond2, 2, 3)))
list(result)     # [0, 2, 0, 1, 3]

注:where函数可以只传条件,返回条件对象的真值下标数组

arr = np.random.randn(10)
np.where(arr>0)      # (array([1, 2, 3, 6, 9]),)

如果是多维数组,返回也是数组,分别返回纬度数组索引

cond1 = np.array([True, False, True, True, False])
cond2 = np.array([True, True, True, False, False])
arr = np.array([cond1,cond2])
np.where(arr)
# (array([0, 0, 0, 1, 1, 1]), array([0, 2, 3, 0, 1, 2]))
# 即 [(0,0),(0,2),(0,3),(1,0),(1,1),(1,2)]位置
  • sort 排序
# 多维数组,可指定方向
arr = np.random.randn(20).reshape(4,5)
'''
[[-0.94603557 -0.18393318  0.11450866  0.40325255  0.45881851]
 [ 1.17704035 -0.41401001  0.75339636 -0.43745415  2.7929479 ]
 [-0.28784153 -1.48745643 -0.07142102 -0.5482369  -0.22610164]
 [ 1.35561729 -1.08766432  0.83278514 -1.32299757  0.04410116]]
 '''
np.sort(arr, axis=0)     # 竖向排序(默认为横向排序)
'''
[[-0.94603557 -1.48745643 -0.07142102 -1.32299757 -0.22610164]
 [-0.28784153 -1.08766432  0.11450866 -0.5482369   0.04410116]
 [ 1.17704035 -0.41401001  0.75339636 -0.43745415  0.45881851]
 [ 1.35561729 -0.18393318  0.83278514  0.40325255  2.7929479 ]]
 '''
 # 一维数组
arr = np.array([2,6,4,2,1,4])
arr.sort()      # 这种方式排序会直接改变「原」数组,使用np.sort()方式则将产生新的排序后的数组,而不改变原数组
print(arr)      # [2 6 4 2 1 4]

例子:我想知道一组数据的25%分位数是多少?

# 产生一组数据
arr = np.random.randn(20).reshape(4,5)
# 1.我们先将其转化为一维数组,并进行排序处理
arr = arr.flatten()
# 排序
arr.sort()
# 获取25%下标数据
value = arr[int(0.25*len(arr))] # 获取25%分位数
print(arr)
'''
[-1.8819284  -1.84223613 -1.55037549 -1.19713841 -0.91661269 -0.69222229
 -0.6796624  -0.65882803 -0.55325753 -0.34502426 -0.1197655   0.36925446
  0.5343373   0.62780224  0.74335279  0.82012463  1.00546263  1.08559715
  1.29212188  1.47629451]
  '''
print(value)    # -0.69222229
  • all、any

    all:是否都是 True , 如果都是返回 True 否则 False
    any: 是否存在 True , 如果存在 True 返回 True 否则 False

arr = np.array([True,False,True,True,False])
arr.all()    # False
arr.any()    # True

布尔型数组的统计方法

arr = np.random.randn(100)
(arr>0).sum()      # 统计正值的总数 
  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值