NumPy使用教程(三)面向数组编程

本文详细介绍了NumPy的面向数组编程,包括numpy.where函数、数组统计函数(如平均数、标准差)、排序、布尔数组操作和数组唯一值计算。还讲解了常用数组函数,如绝对值、平方根等,并探讨了矩阵运算,如矩阵点乘、行列式、逆矩阵等。强调了矩阵点乘与逐元素乘积的区别。
摘要由CSDN通过智能技术生成

NumPy面向数组编程NumPy使用教程(三)面向数组编程
来自http://www.tpleina.com/2019/05/3281302163.html

面向数组编程

NumPy数组通过简单的数组表达式完成多种数据操作任务,数组表达式代替循环的方法称之为向量化

numpy.where

numpy.where函数是三目运算x if condition else y的数组版

使用示例

条件+数组+数组形式

import numpy as np

arr1 = np.random.randn(6)
arr2 = np.random.randn(6)
cond = np.array([True,True,True,False,False,False])
print(arr1)
print(arr2)
arr3 = np.where(cond, arr1, arr2)
print(arr3)
# 输出
[ 1.27341434  0.98277035 -0.37508696 -0.10692764  0.61461728 -0.49524537]
[-0.17197977 -1.54415347  2.10698458 -0.59802743 -0.39001325  1.29582979]
[ 1.27341434  0.98277035 -0.37508696 -0.59802743 -0.39001325  1.29582979]

条件+标量+数组形式

import numpy as np

arr = np.random.randint(-50,50,(4,5))
print(arr)
t_num = 10
arr1 = np.where(arr>0, t_num, arr)
print(arr1)
# 输出
[[-17  29 -39 -42  28]
 [ 32  33  49  22  47]
 [-22 -36  10  11  24]
 [ 30 -29  -1  40 -27]]
[[-17  10 -39 -42  10]
 [ 10  10  10  10  10]
 [-22 -36  10  10  10]
 [ 10 -29  -1  10 -27]]

条件+标量+标量形式

import numpy as np

arr = np.random.randint(-50,50,(4,5))
print(arr)
t_num = 10
f_num = -10
arr1 = np.where(arr>0, t_num, f_num)
print(arr1)
# 输出
[[ 18  47 -16 -50  31]
 [ 34 -39  38 -47 -41]
 [  4 -20  41  37  23]
 [-15 -48  12 -32 -34]]
[[ 10  10 -10 -10  10]
 [ 10 -10  10 -10 -10]
 [ 10 -10  10  10  10]
 [-10 -10  10 -10 -10]]

数组统计函数

  • sum 沿着轴向,计算所有元素累积和
  • mean 算数平均数
  • stdvar 标准差、方差
  • minmax 最大值、最小值
  • argminargmax 最大和最小元素的位置
  • cumsum 从0开始元素累积和
  • cumprod 从1开始元素累积和

以上方法都可传入axis参数,表示某个轴线方向操作:0轴表示行,1轴表示列

数组统计函数使用示例

import numpy as np

arr1d = np.random.randint(1,50,10)
arr2d = np.random.randint(1,50,(4,5))
print(arr1d.sum())
print(arr2d)
# 行的累积和
print(arr2d.sum(axis=1))
# 列的累积和
print(arr2d.sum(axis=0))
# 所有元素累积和
print(arr2d.sum())

# 行的平均值
print(arr2d.mean(axis=1))
# 列的平均值
print(arr2d.mean(axis=0))
# 所有元素平均值
print(arr2d.mean())

# 行的最大值
print(arr2d.max(axis=1))
# 列的最大值
print(arr2d.max(axis=0))
# 所有元素最大值
print(arr2d.max())

# 行的最大位置
print(arr2d.argmax(axis=1))
# 列的最大位置
print(arr2d.argmax(axis=0))
# 所有元素最大位置
print(arr2d.argmax())

排序

数组通过np.sort实现对数组的排序

import numpy as np
a1 = np.floor(10*np.random.random((4,4)))
print a1
# 按照行维度排序
a1.sort(axis=1)
np.sort(a1, axis=1)
print a1
# 按照列维度排序
a1.sort(axis=0)
np.sort(a1, axis=0)
print a1

针对多维数组,可传入axis参数,按照某个轴线方向排序:0轴表示行,1轴表示列

布尔数组使用

布尔值会被强制转换为1(True)和0(False),因此sum可以统计布尔数组中True的个数

import numpy as np
arr = np.random.randn(100)
# 统计正数的个数
res = (arr>0).sum()
print(res)
  • np.any 检查数组至少有一个True
  • np.all 检查数组每个元素都为True
import numpy as np

arr = np.random.randint(-50,50,10)
arr1 = arr>0
print(arr1)
print(arr1.any())
print(arr1.all())

数组唯一值

  • unique(x) 计算x中的唯一元素,并返回有序结果
  • intersect1d(x, y) 计算x和y的公共元素,并返回有序结果
  • union1d(x, y) 计算x和y的并集,并返回有序结果
  • in1d(x, y) 得到一个表示x的元素是否包含于y的布尔数组
  • setdiff1d(x, y) 集合的差,即元素在x中且不在
  • setxor1d(x, y) 集合的对称差,即存在于一个数组中但不同时存在于两个数组中的元素
arr = np.array([3, 3, 2, 2, 1, 1, 4])
# 消重、排序输出
>>np.unique(arr)
array([1, 2, 3, 4])
# 等价于
>> sorted(set(arr))
array([1, 2, 3, 4])
# np.in1d 数组arr那些元素存在于第二个数组中,并返回布尔数组
>> np.in1d(arr, [2, 3, 6])
array([True, True, True, True, False, False, False])

常用数组函数

常用函数能对ndarray对象逐元素扫描操作

一元函数,接收一个参数,并返回一个数组结果。有:

  • absfabs 计算数组元素绝对值
  • sqrt 计算数组元素平方根
  • square 计算数组元素平方
  • exp 计算数组元素指数
  • loglog10log2log1p 分别为自然对数(底数为e)、底数为10的log、底数为2的log、log(1+x)
  • sign 计算数组元素正负号
  • ceil 计算数组元素ceiling值,即大于等于该值的最小整数
  • floor 计算数组元素floor值,即小于等于该值的最大整数
  • rint 计算数组元素值四舍五入到最接近的
  • modf 将数组的小数和整数部分以两个独立的数组形式返回
  • isnan “哪些值是NaN” 返回布尔值
  • isfiniteisinf “哪些元素是有穷的” “哪些元素是无穷的”
  • coscoshsinsinhtantanh 普通型和双曲型三角函数
  • arccosarccosharcsinarcsinharctanarctanh 反三角函数

二元函数,接收两个参数,并返回一个数组结果。有:

  • add 两个数组对应元素相加
  • subtract 两个数组对应元素做减法
  • multiply 数组元素相乘
  • dividefloor_divide 数组元素整除
  • power 数组元素的n次方
  • maximumfmax 获取数组元素最大值,fmax将忽略nan
  • minimumfmin 获取数组元素最小值,fmin将忽略nan
  • mod 元素级的求模计算
  • copysign 将第一个数组的符号值改为第二个数组的符号值
  • greatergreater_equallessless_equalequalnot_equal 数组元素比较运算,产生布尔型数组
  • logical_andlogical_orlogical_xor 数组元素元素间与或运算

同时数组函数都可接受一个可选参数out,用于对数组进行按位操作

矩阵运算

首先说一下什么是矩阵,矩阵是数组的一个子集,数组可以有多维,一维、二维、三维、多维等,其中二维数组被称为矩阵

矩阵计算函数有:

  • diag 将一个方阵的对角元素作为一维数组返回,或将一维数组转换成一个方阵,并且在非对角线为0点
  • dot 矩阵点乘
  • trace 计算对角线元素和
  • det 计算矩阵行列式
  • eig 计算方阵的特征值和特征向量
  • inv 计算方阵的逆矩阵
  • pinv 计算矩阵的Moore-Penrose伪逆
  • qr 计算QR分解
  • svd 计算奇异值分解(SVD)
  • solve 解线性方程组Ax = b, 其中A为一个方阵
  • lstsq 计算Ax = b的最小二乘解

额外说一下:矩阵点乘 使用np.dot实现的,而运算符 * 是对数组逐元素乘积,千万不要跟矩阵点乘搞混!

总结

本节主要介绍NumPy 面向数组编程内容,涉及到NumPy大量函数,针对这些函数的使用额外补充一点:
除了可以这样arr.func调用函数,也可以通过numpy.func方式调用NumPy提供的函数!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值