numpy基础
1.为什么要学习numpy?
-> 快速
-> 方便
-> 科学计算的基础库
2.什么是numpy?
一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算。
3. 如何在python中使用numpy?
import numpy as np
ndarray 多维数组(N Dimension Array)
NumPy数组是一个多维的数组对象(矩阵),称为ndarray,具有矢量算术运算能力和复杂的广播能力,并具有执行速度快和节省空间的特点。
ndarray拥有的属性
-> ndim属性:维度个数
-> shape属性:维度大小
-> dtype属性:数据类型
numpy生成随机数
# 导入numpy,别名np
import numpy as np
# 生成指定维度大小(3行4列)的随机多维浮点型数据(二维),rand固定区间0.0 ~ 1.0
arr = np.random.rand(3, 4)
print(arr)
print(type(arr))
# 生成指定维度大小(3行4列)的随机多维整型数据(二维),randint()可以指定区间(-1, 5)
arr = np.random.randint(-1, 5, size = (3, 4)) # 'size='可省略
print(arr)
print(type(arr))
# 生成指定维度大小(3行4列)的随机多维浮点型数据(二维),uniform()可以指定区间(-1, 5)
arr = np.random.uniform(-1, 5, size = (3, 4)) # 'size='可省略
print(arr)
print(type(arr))
print('维度个数: ', arr.ndim)
print('维度大小: ', arr.shape)
print('数据类型: ', arr.dtype)
numpy生成序列
1. np.array(collection) 和 np.arange( )
以下 a,b,c内容相同
a = np.array([1,2,3,4])
b = np.array(range(1,5))
c = np.arange(1,5)
2.np.zeros()
指定大小的全0数组。注意:第一个参数是元组,用来指定大小,如(3, 4)。
np.zeros((3,4))
3. np.ones()
指定大小的全1数组。注意:第一个参数是元组,用来指定大小,如(3, 4)。
np.ones((3,4))
4.np.random.shuffle() 和 reshape()
random.shuffle() 将打乱数组序列(类似于洗牌)。
arr = np.arange(15).reshape(3,5)
print(arr)
np.random.shuffle(arr)
print(arr)
ndarray的数据类型
1. dtype参数
指定数组的数据类型,类型名+位数,如float64, int32
2. astype方法
转换数组的数据类型
# 初始化3行4列数组,数据类型为float64
a = np.zeros((3, 4), dtype=np.float64)
print(a.dtype)
# astype转换数据类型,将已有的数组的数据类型转换为int32
a_int = a.astype(np.int32)
print(a_int.dtype)
ndarray的矩阵运算
1. 矢量运算:相同大小的数组间运算应用在元素上
# 矢量与矢量运算
arr = np.array([[1, 2, 3],
[4, 5, 6]])
print("元素相乘:")
print(arr * arr)
print("矩阵相加:")
print(arr + arr)
2. 矢量和标量运算:“广播” - 将标量"广播"到各个元素
# 矢量与标量运算
print(1. / arr)
print(2. * arr)
print(arr + 1)
3.矢量和矢量运算:广播原则
举个例子,也就是说,
shape为(3,3,3)的数组能够和(3,2)的数组,进行计算么?
No.
shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?
Yes.
a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]]) # 2行6列
b = np.array([1,2,3,4,5,6]) # 1行6列
print(a - b)
print(a * b)
ndarray的索引与切片
1. 一维数组的索引与切片
与Python的列表索引功能相似
# 一维数组
arr1 = np.arange(10)
print(arr1)
print(arr1[2:5])
运行结果:
[0 1 2 3 4 5 6 7 8 9]
[2 3 4]
2. 多维数组的索引与切片:
3. numpy中数值的修改
4. 条件索引
把t中小于10的数字替换为0t[t<10] = 0
2.把t中小于10的数字替换为0,把大于10的替换为10
np.where(t<10,0,10) #利用三元运算符
3. 小于10的替换为10,大于18的替换为18
t.clip(10,18)
numpy中的转置
可通过以下三种方法进行转置操作:
a. transpose()
a.T
a.swapaxes(1,0)
numpy中的nan和inf
1.nan(NAN,Nan):not a number表示不是一个数字
什么时候numpy中会出现nan:
当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
2.inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷
什么时候回出现inf包括(-inf,+inf)
比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)
3.那么如何指定一个nan或者inf呢?
注意他们的type类型 : nan 或 inf 为 float类型
np.nan != np.nan 利用这个特性,我们可以通过 np.count_nonzero(t != t)来统计数组中nan的个数
ndarry缺失值填充均值
for i in range(t.shape[1]):
nan_num = np.count_nonzero(t[:,i] != t[:i]) # 计算nan的个数
if nan_num > 0:
col_sum = t[:,i][np.isnan(t[:,i]) == False].sum() # 求和
col_mean = col_sum / (t.shape[0] - nan_num) #求每一列的均值
t[:,i][np.isnan(t[:,i])] = col_mean #替换
数组的拼接
数组水平或者竖直拼接很简单,但是拼接之前应该注意什么?
竖直拼接的时候:每一列代表的意义相同!!!否则牛头不对马嘴
如果每一列的意义不同,这个时候应该交换某一组的数的列,让其和另外一类相同
那么问题来了?
如何交换某个数组的行或者列呢?
数组的行列交换
numpy中更多好用的方法
1.获取最大值最小值的位置
np.argmax(t,axis=0)
np.argmin(t,axis=1)
2.求和,平均值
np.mean(arr)
np.sum(arr)
3.求最大值,最小值
np.max(arr)
np.min(arr)
3.求标准差,方差
np.std()
np.var()
4.多维数组默认统计全部维度,axis参数可以按指定轴心统计,值为0则按列统计,值为1则按行统计。
arr = np.arange(12).reshape(3,4)
print(arr)
print(np.sum(arr, axis=0)) # 数组的按列统计和
print(np.sum(arr, axis=1)) # 数组的按行统计和
5.判断函数
np.any(): 至少有一个元素满足指定条件,返回True
np.all(): 所有的元素满足指定条件,返回True
arr = np.random.randn(2,3)
print(arr)
print(np.any(arr > 0))
print(np.all(arr > 0))
运行结果:
[[ 0.05075769 -1.31919688 -1.80636984]
[-1.29317016 -1.3336612 -0.19316432]]
True
False
6.元素去重排序函数
np.unique():找到唯一值并返回排序结果,类似于Python的set集合
arr = np.array([[1, 2, 1], [2, 3, 4]])
print(arr)
print(np.unique(arr))
运行结果:
[[1 2 1]
[2 3 4]]
[1 2 3 4]
numpy读取数据
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)