笔记:numpy的基本操作及常用函数

一、操作方式:
import numpy as np
# 1.生成数组
list1 = [1, 2, 3, 4]
arr1 = np.array(list1)  # 把列表变成一维数组,元组类似
arr2 = np.arange(1, 20, 2)  # 创建[1,20)顺序1d数组,现在指定是2(start,end,step),默认step=1,star=0
arr3 = np.zeros(4)  # 创建全为0的1d数组,默认是浮点型f
arr4 = np.ones(4)  # 创建全为1的1d数组,默认是浮点型f
arr5 = np.eye(3)  # 创建全为1的2d对角矩阵,默认是浮点型f
arr6 = np.random.rand(5)  # 创建[0,1)的随机1d数组,参数是元素个数
arr7 = np.random.randint(1, 5, (2, 3))  # 创建([stat,end),(shape))的随机整数数组
arr8 = np.random.uniform(1, 3, (2, 2))  # 创建([stat,end),(shape))的随机浮点型数组
arr9 = np.linspace(-1, 1, 20)  # 创建([stat,end],个数)均匀分布数组
arr10 = np.arange(20)  # 创建[0,19]step为1的1d数组
# 2.改变数组的形状
np.random.shuffle(arr10)  # 随机打乱数组
arr11 = arr10.reshape(4, 5)  # 重新生成改变形状的数组,原数组不变,形状(矩阵个数,行,列)
print(arr10.ndim, arr11.ndim, arr11)
print(arr11.transpose())  # 矩阵转置相当于数组名.T,带括号的是函数不会改变原值,返回一个新值
print(arr11.flatten())  # 将数组变成1d
print(arr11.ravel())  # 将数组变成1d
print(arr11.reshape(20))  # 将数组变成1d
print(arr11)
arr12 = np.random.randint(0, 2, (4, 2))
print(np.hstack((arr11, arr12)))  # 必须是同维数组,且拼接2对象作为一个参数输入,横拼行数相同
arr13 = np.random.randint(0, 2, (1, 5))
print(np.vstack([arr11, arr13]))  # 必须同列,元组和列表组合成为一个参数
print(np.hsplit(arr11, 5))  # 横切,5列必须是均等分,只能切5份相当于np.split(arr11, 5, axis=1)
print(np.vsplit(arr11, 2))  # 竖切,4行,2份是均等份,相当于np.split(arr11, 2, axis=0)
print(np.array_split(arr11, 3, axis=1))  # 1为竖轴,0为横轴
print(np.array_split(arr11, 3, axis=0))
# 3.切片与索引
# 一维数组的直接索引和列表一样,bool索引把满足条件元素变成True,不满足变成False
print(arr1[(arr1 > 2) & (arr1 < 5)])  # 把arr1中(2,5)之间的数据提取出来,and用&,or用|,相等一样
# 二维数组的索引
arr14 = np.random.uniform(1, 5, (3, 3))
print(arr14, arr14[0, 0], arr14[-1, -1], arr14[1:, 1:])
arr14[arr14 < 2] = 0  # bool选择元素然后改变其值
# 4.数组的增删改
# 数组的增加等于拼接,删除等于切片提取,改等于根据索引赋值
arr14[:2, :2] = [[0, 0], [1, 1]]  # 将数组中的(2,2)部分修改,shape必须一样
print(arr14, arr14[:3, :2])  # 先确定所有行,再提取0-2列,是行就直接提取
print(np.delete(arr14, 1, axis=1))  # (数组,索引(int或者bool),轴向)删除第2列
print(np.delete(arr14, 6))  # 删除n/列整行余列元素,此处n为6,即(2,0)3行1列元素,返回的是一个一维数组
二、常用函数:
# 1.统计函数
arr1 = np.random.randint(0, 120, (20, 6))
print(arr1)
print(np.sum(arr1, axis=1))  # 按照行求和返回一个一维数组
print(np.sum(arr1, axis=0))  # 按照列求和返回一个一维数组
print(np.sum(arr1[1]))  # 指定2行求和
print(np.sum(arr1[:, 2]))  # 指定3列求和
print(np.mean(arr1[:, 2]))  # 指定3列求平均
print(np.var(arr1[:, 2]))  # 指定3列求方差,标准差为std,最大max,最小min
print(np.argmax(arr1[:, 2]))  # 返回指定列最大值的索引,最小为argmin
print(np.cumsum(arr1))  # 数组所有元素累加,返回一维数组
print(np.cumprod(arr1[1]))  # 数组指定行所有元素累乘,返回一维数组
# 2.字符串函数,一般用不到,numpy主要用来科学计算
# 3.算术函数,作用于每一个元素
arr1 = np.random.uniform(0, 12, (3, 4))
print(np.ceil(arr1))  # 向上取整
print(np.floor(arr1))  # 向下取整
print(np.rint(arr1))  # 四舍五入取整
print(np.isnan(arr1))  # 判断是否不是数字,绝对值abs()
print(arr1, np.divide(2, arr1))  # 2除以数组中每一个元素
print(arr1, np.multiply(1/3, arr1))  # 数组中每一个元素除以3
print(arr1, np.where(arr1 > 1, 2, arr1))  # 三目运算符,数组中每一个元素满足条件执行变成2,不满足执行本身
三、数组的运算及nan和inf:
# 广播机制的核心就是需要有一个维度是兼容的,运算兼容矩阵运算
import numpy as np
arr1 = np.random.randint(0, 12, (3, 4))
arr2 = arr1 + 4  # 每个数组都加上4
arr3 = np.random.randint(0, 12, (3, 4))
arr4 = arr2 + arr3  # 相同shape对应元素相加
arr5 = np.arange(4)
arr6 = arr2 + arr5  # 1d数组默认被每行相加,列数要一致,列可通过转置实现
arr7 = arr2[0] + arr5  # 指定行和1d数组相加,返回1d数组
arr8 = np.arange(3)
arr9 = arr2[:, 0] + arr8  # 指定列和1d数组相加,返回1d数组,
# nan[0/0,nan参与计算,读取数据缺失],inf正无穷,任意非0数据/0
# 任意两个nan默认不相等(利用数组本身相等判断就可以获取nan),一般删除,或者用0和平均值填充
arr1[0] = 0
arr10 = arr1/0  # 构造一个第一行为nan的数据
print(arr10, np.where(arr10 != arr10, 2, arr10))  # 把nan替换成2,inf是可以相等的

猜你喜欢

转载自blog.csdn.net/lizhyangmm/article/details/127133034
今日推荐