自学整理记录,大神见笑
为什么学习numpy
- 快速
- 方便
- 科学计算的基础库
什么是numpy
- 一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于在大型、多维数组上执行数值运算
- 导包
import numpy as np
numpy基础操作
- 创建数组,生成ndarray
t1 = numpy.arange(3)
t2 = numpy.arange(3, 7)
t3 = numpy.arange(3, 7, 2)
t4 = numpy.arange(0, 1, 0.1)
t5 = numpy.arange(3.0)
print(t1)
print(t2)
print(t3)
print(t4)
print(t5)
输出:array([0, 1, 2])
array([3, 4, 5, 6])
array([3, 5])
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
array([ 0., 1., 2.])
注:array([0, 1, 2])这种格式就是ndarray
注:np.arange(10)是numpy特有方法,等于np.array(range(10))
查看ndarray中的元素数据类型
t1 = numpy.arange(3)
t1.dtype
- numpy有特有数据类型
- 指定ndarray中的元素数据类型
np.arange(4,dtype="float32")
- 调整ndarray中元素的数据类型
t1 = np.arange(4,dtype="float32")
t2 = t1.astype("bool")
- 限制小数位数
t1 = np.array([random.random() for i in range(10)])
np.round(t1, 2)
- 注:round第二个参数就表示保留几位小数
数组的形状
- 查看数组的形状
a = numpy.array([1, 2, 3])
b = numpy.array([[1, 2, 3],[4, 5, 6]])
print(a.shape)
print(b.shape)
输出:(3,)
(2,3)
- 修改数组的形状
t1 = numpy.arange(12)
print(t1.reshape((3, 4)))
输出:([[0,1,2,3], [4,5,6,7], [8,9,10,11]])
注:reshape有返回值,不会改变原来t1的形状
注:变成一维数组传(24,),24为所有元素的个数
将其他形状数组展开成一维数组
t1 = numpy.arange(12).reshape((3, 4)
t1.flatten()
- 将数组转置
t1 = np.arange(12).reshape(3,4)
t1.transpose()
t1.T
t1.swapaxes(1,0)
注:转置就是将数组按对角线为中心交换数据
注:转置有上面三种方法
计算
t1 = numpy.arange(12).reshape((3, 4)
print(t1 + 2)
print(t1 - 2)
print(t1 * 2)
print(t1 / 2)
- 注:t1中每个值都会去计算加减乘除
- 注:t1 / 0,如果t1元素的值是0,则返回nan;如果不是0,则返回inf
t1 = numpy.arange(12).reshape((3, 4)
t2 = numpy.arange(100,112).reshape((3, 4)
print(t1 + t2)
print(t1 - t2)
print(t1 * t2)
print(t1 / t2)
- 注:对应位置的元素做计算
- 注:维度不同的数组进行计算,符合广播原则就可以计算;没有对应就会报错ValueError: operands could not be broadcast together with shapes
- 注:广播原则:如果两个数组的后缘维度的轴长度相等或其中一方的长度为1,即认为广播兼容,可以计算
轴
- 在numpy中使用0,1,2...数字表示,一维数组只有一个0轴;二维数组(shape(0,0))有0轴和1轴;三维数组(shape(0,0,0))有0轴和1轴和2轴
numpy读取数据
numpy实际中不会用读取数据库数据功能,因为pandas中有更强大的方法是,了解即可
csv文件,逗号分隔文件,csv文件里所有的数据都是用逗号隔开的
读取
np.loadtxt(frame,dtype="float",delimiter=None,skiprows=0,usecols=None,unpack=False)
参数 | 解释 |
---|---|
frame | 路径 |
dtype | 元素数据类型,默认会把较大的数据转化为科学计数的方式 |
delimiter | 以什么分隔,不指定会报错 |
skiprows | 跳过前x行,一般跳过第一行表头 |
usecols | 读取指定的列,索引,元组类型 |
unpack | 默认False,如果是True则转置 |
numpy索引和切片
- 取单行
t1[2]
- 取连续多行
t1[2:]
- 取不连续多行
t1[[2,8,10]]
- 取单列
t1[:,0]
- 取连续多列
t1[:,2:]
- 取不连续多列
t1[:,[2,6,8]]
- 同时取单行和单列
t1[2,3]
- 同时取多行和多列
t1[2:5,1:4]
注:冒号:左闭右开
取多个不相邻的点
t1[[0,2,3],[0,1,3]]
注:取的是坐标(0,0)(2,1)(3,3)三个点
修改numpy中的数值
t1[:,2:4] = 0
注:取到对应的行、列、点赋值即可
修改筛选出来的条件的值
t1[t1 < 10] = 10
注:上面表示所有小于10的点修改为10
numpy中三元运算符
np.where(t < 10, 0, 10)
注:表示所有小于10的数替换为0,大于等于10的数替换为10
numpy中的clip(裁剪)
t.clip(10, 18)
注:表示把小于10的都替换为10,大于18的都替换为18
把值替换为nan
t1.astype(float)
t2[3,3] = np.nan
- 注:如果直接执行第二句代码,可能会报错ValueError:cannot convert float NaN to integer,表示不能将int类型的nan赋值给float,nan是float类型
数组的拼接
- 竖直拼接
t1 = array([[0,1,2],[3,4,5]])
t2 = array([[6,7,8],[9,10,11]])
np.vstack((t1, t2))
结果是array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
- 水平拼接
t1 = array([[0,1,2],[3,4,5]])
t2 = array([[6,7,8],[9,10,11]])
np.hstack((t1, t2))
结果是array([[0,1,2,6,7,8],[3,4,5,9,10,11]])
数组的行列交换
- 行交换
t1[[1,2],:] = t1[[2,1],:]
- 列交换
t1[:,[1,2]] = t1[:,[2,1]]
numpy更多方法
- 创建一个全0的数组
np.zeros((3, 4))
- 创建一个全1的数组
np.ones((3, 4))
- 创建一个对角线为1的数组
np.eye(10)
注:10参数为10行10列
获取最大值,最小值的位置
np.argmax(t, axis=0)
np.argmin(t, axis=0)
- 注:axis=0,表示列;axis=1,表示行
numpy生成随机数
参数 | 解释 |
---|---|
np.random.rand(d0,d1,...dn) | 创建d0到dn维度均匀分布的随机数数组 |
np.random.randn(d0,d1,...dn) | 创建d0到dn维度正态分布的随机数数组 |
np.random.randint(low,high,(shape)) | 生成随机整数,low到high是范围,size是形状 |
np.random.uniform(low,high,(size)) | 生成随机小数,low到high是范围,size是形状 |
np.random.seed(s) | 只在第一次生成随机数,后续再生成和第一次一样 |
numpy的注意点copy和view
- a = b,a = b[:],复制,会相互影响
- a = b.copy(),复制,a和b互不影响
numpy中的nan和inf
nan:not a number表示不是一个数字,nan是浮点类型
nan出现情况
1.0除0
2.数据缺失
3.无穷大减去无穷大,无穷大加上无穷大inf:infinity,inf表示正无穷,-inf表示负无穷,inf是浮点类型
inf出现情况
1.一个非0数字除0注意点:
1.np.nan == np.nan False
2.np.nan != np.nan True
3.np.count_nonzero(t != t) 判断ndarray中nan个数
4.np.isnan(t) 判断ndarray中哪些地方是nan,可以替换为0
5.nan和任何值计算都是nan
6.把nan替换为0不合适,会降低平均值等,合适的操作时替换为均值nan替换为均值示例代码
import numpy as np
t1 =np.arange(12).reshape((3,4)).astype("float")
t1[1, 2:4] = np.nan
print(t1)
for i in range(t1.shape[1]):
temp_col = t1[:, i]
nan_num = np.count_nonzero(temp_col != temp_col)
if nan_num != 0:
# 获取该列所有值不是nan的array
temp_not_nan_col = temp_col[temp_col == temp_col]
# 将temp_not_nan_col的均值赋值给temp_col中值为nan的位置
temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
print(t1)
numpy中常用统计函数
函数 | 含义 |
---|---|
np.sum(t,axis=None) | 求和 |
np.mean(t,axis=None) | 均值 |
np.median(t,axis=None) | 中值 |
np.max(t,axis=None) | 最大值 |
np.min(t,axis=None) | 最小值 |
np.ptp(t,axis=None) | 最大值和最小值的差 |
np.std(t,axis=None) | 标准差 |