Python数据分析—numpy

数组

创建数组

# 返回类型: <class 'numpy.ndarray'>
# 3种方式
# 整数数组
arr00 = np.array([0, 1, 2, 3])  # arr00: [0 1 2 3]
arr00 = np.array(range(4))  # arr00: [0 1 2 3]
arr00 = np.arange(4)  # arr00: [0 1 2 3]

# 小数数组
arr01 = np.array([random.random() for i in range(3)])
# arr01: [0.1357549  0.94839629 0.20317405]
arr02 = np.round(arr2, 2)  #保留2位小数
# arr02: [0.14 0.95 0.2]

# 二维数组
arr03 = np.array([[0, 1, 0], [1, 0, 1]])  # arr03: [[0 1 0] [1 0 1]]

# 其他数组
# 创建范围为[-3,3],中间间隔相同,共7个元素的数组
arr04 = np.linspace(-3, 3, 7)  # arr04: [-3. -2. -1.  0.  1.  2.  3.]
# 创建元素都为e的n次方的数组
arr05 = np.exp(np.arange(4))  # arr05: [1 2.71828183  7.3890561  20.08553692]

一般numpy的参数传入参数或列表均可,如下边两种写法是等效的

np.stack([np.zeros(3), np.ones(3)])
np.stack((np.zeros(3), np.ones(3)))
# [[0 0 0] [1 1 1]]

形状

# 获取数组形状
arr10.shape  # (2,3)->2行3列
# 改变数组形状
arr11 = arr3.reshape(3, 2)  # arr11: [[0 1] [0 1] [0 1]]
# 直接变成一维的
arr12 = arr3.flatten()  # arr12: [0 1 0 1 0 1]

运算

二维和三维:从后往前看维度,必须相同才可以运算

  • (3,3,3)和(3,2)能不能运算? -> 不能

  • (3,3,2)和(3,2)能不能运算? -> 能

arr20 = np.array([[1, 1, 1], [1, 1, 1]])  # arr20: [[1 1 1] [1 1 1]]

# 数组"+-*/"数组: 数组的每个值都变
arr21 = arr20 + 10  # arr21: [[11 11 11] [11 11 11]]

# 数组 +-*/ 同形状数组: 对应位置改变
arr22 = np.array([[2, 2, 2], [2, 2, 2]])
arr23 = arr21 + arr22  # arr23: [[3 3 3] [3 3 3]]

# 数组 +-*/ 不同形数组: 按照相等的行或相等的列运算,但必须在某一维度相同
arr24 = np.array([3, 3, 3])  # 列全部对应上,每列相减
arr25 = arr20 + arr24  # arr25: [[4 4 4] [4 4 4]]
arr26 = np.array([0], [1])  # 行全部对应上,每行相减
arr27 = arr20 + arr26  # arr26: [[1 1 1] [2 2 2]]

转置

必须是二维数组

arr30 = np.array([[0, 1, 2], [3, 4, 5]])  # arr30: [[0 1 2] [3 4 5]]

# 转置的3种方法						#arr31:[[0 3] [1 4] [2 5]]
arr31 = arr30.transpose()
arr31 = arr30.T
arr31 = arr30.swapaxes(1, 0)  # 交换轴,原始轴为(0,1)

切片

arr40 = np.array(range(9)).reshape(3, 3)  # arr40: [[0 1 2] [3 4 5] [6 7 8]]

# 取一行
arr41 = arr40[0];
arr41 = arr40[0, :]  # arr41: [0 1 2]
# 取多行
arr42 = arr40[0:2]  # 连续取		#arr42: [[0 1 2] [3 4 5]]
arr43 = arr40[[0, 2]]  # 间断取		#arr43: [[0 1 2] [6 7 8]]

# 取一列
arr44 = arr40[:, 0]  # arr44: [0 3 6]
# 取多列
arr45 = arr40[:, 0:2]  # 连续取		#arr45: [[0 1] [3 4] [6 7]]
arr46 = arr40[:, [0, 2]]  # 间断取		#arr46: [[0 2] [3 5] [6 8]]

# 取一行一列
arr47 = arr40[1, 1]  # arr47: 4
# 取多行多列
arr48 = arr40[0:2, 2:]  # 连续取		#arr48: [[4 5] [7 8]]
arr49 = arr40[[0, 2], [2, 0]]  # 间断取	#arr49: [2 6]

替换

arr50 = np.array(range(9)).reshape(3, 3)  # arr50: [[0 1 2] [3 4 5] [6 7 8]]

# 布尔索引: 大于6的元素都替换为6
arr50[arr50 > 6] = 6  # arr50: [[0 1 2] [3 4 5] [6 6 6]]

# where三目运算符: >=6的变为6,否则变为0
arr51 = np.where(arr50 >= 6, 6, 0)  # arr51: [[0 0 0] [0 0 0] [6 6 6]]

# clip裁剪,但不能替换nan: <1的变成1,>5的变成5
arr52 = arr50.clip(1, 5)  # arr52: [[1 1 1] [1 1 1] [5 5 5]]

拼接

a = [1, 2, 3]
b = [4, 5, 6]
# stack
arr = np.stack((a, b))  # [[1 2 3] [4 5 6]]
arr = np.stack((a, b), axis=1)  # [[1 4] [2 5] [3 6]]
# dstack: 像luo'pukepai
arr = np.dstack((a, b))  # [[[1 4] [2 5] [3 6]]]

A = np.array([[0, 0, 0], [0, 0, 0]])  # [[0 0 0] [0 0 0]]
B = np.array([[1, 1, 1], [1, 1, 1]])  # [[1 1 1] [1 1 1]]
# 竖直方向拼接
arr = np.vstack(A, B)  # [[0 0 0] [0 0 0] [1 1 1] [1 1 1]]
# 水平方向拼接
arr = np.hstack(A, B)  # [[0 0 0 1 1 1] [0 0 0 1 1 1]]

去除1维

从数组的形状中删除单维度条目,即把shape中为1的维度去掉。在机器学习和深度学习中,通常算法的结果是可以表示向量的数组(即包含两对或以上的方括号形式[[]]),如果直接利用这个数组进行画图可能显示界面为空。squeeze方法将表示向量的数组转换为秩为1的数组,这样利用matplotlib库函数画图时,就可以正常的显示结果了

# a.shape: (1,10)
a = np.arange(10).reshape(1, 10)  # [[0 1 2 3 4 5 6 7 8 9]]
# arr.shape: (10,)
arr = a.squeeze()  # [0 1 2 3 4 5 6 7 8 9]

# b.shape: (1,2,5)
b = np.arange(10).reshape(1, 2, 5)  # [[[0 1 2 3 4] [5 6 7 8 9]]]
# arr.shape: (2,5)
arr = b.squeeze()  # [[0 1 2 3 4] [5 6 7 8 9]]

""" shape:去掉为1的,并且后边的往前顺延
(1,10) -> (10,) 
(1,2,5) -> (2,5)
(1,10,1) -> (10,)"""

对角线矩阵

a = [1, 2, 3]
b = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# arg为1维数组时,返回以一维数组为对角线元素的矩阵
arr = np.diag(a)  # [[1 0 0] [0 2 0] [0 0 3]]
# arg为二维矩阵时,返回矩阵的对角线元素组成的一维数组
arr = np.diag(b)  # [1 5 9]

行列交换

【原地操作!!!】

# 交换两行
arr70 = np.array([[0, 0, 0], [1, 1, 1]])  # arr70: [[0 0 0] [1 1 1]]
arr70[[0, 1], :] = arr70[[1, 0], :]  # arr70: [[1 1 1] [0 0 0]]

# 交换两列
arr71 = np.array([[0, 1, 2], [0, 1, 2]])  # arr71: [[0 1 2] [0 1 2]]
arr71[:, [0, 2]] = arr71[:, [2, 0]]  # arr71: [[2 1 0] [2 1 0]]

常用属性

np.pi		# 3.141592653589793

常用方法

arr80 = np.array([[0, 1, 2], [3, 4, 5]])  # arr80: [[0 1 2] [3 4 5]]

# 求指定轴的最值
np.argmax(arr80, axis=0)  # [1 1 1], 0轴的最大值
np.argmin(arr80, axis=1)  # [0 0], 1轴的最小值
# 统计数组中不为0的元素个数
np.cout_nonzero(arr80)  # 5
# 求和,参数axis指定轴计算,如果不写就是所有元素的和
np.sum(arr80)  # 15
# 创建一个全为0的数组:传入【元组】
arr81 = np.zeros((3, 3))  # [[0 0 0] [0 0 0] [0 0 0]]
# 创建一个全为1的数组
arr82 = np.ones((3, 3))  # [[1 1 1] [1 1 1] [1 1 1]]
arr = np.ones(3)  # [1 1 1]
# 创建单位阵E,传入行数(列数)
arr83 = np.eye(3)  # [[1 0 0] [0 1 0] [0 0 1]]
# 常用函数库
np.power(x, y)  # x的y次方
np.linalg.inv(x)  # x的逆矩阵

随机

# 创建n维均匀分布的随机浮点数,每个元素范围为[0,1]
arr90 = np.random.rand(2, 2)  # 2行2列
# arr90: [[0.22895205 0.58552502] [0.74712256 0.85938155]]
# 创建n维标准正态分布的随机浮点数,平均数0,标准差为1
arr91 = np.random.randn(2, 2)
# arr91:[[-1.49063948 1.06868193] [-2.27935423 0.36040082]]
# 随机生成形状为shape的范围为[m,n]的数组
arr92 = np.random.randint(0, 20, (2, 2))  # 2行2列,每个元素范围[0,20]
# arr92: [[0 15] [9 2]]
# 产生种子,下面不管几次执行程序随机数组相同,参数为标志flag(不是次数)
np.random.seed(3)
arr93 = np.random.randint(0, 10, (2, 2))
# arr93: [[8 9] [3 8]],保持不变

# 洗牌,打乱顺序
np.random.shuffle(arr)

nan和inf

arr00 = np.array([[0, 1, 2], [3, 4, np.nan]])

# nan:0/0或丢失的float

# 两个nan不相等
np.nan == np.nan  # False 

# 判断数组每个元素是否为nan,等效于t120!=t120
np.isnan(arr00)  # [[False False False] [False False True]]

# 统计数组中nan的个数
np.count_nonzero(np.isnan(arr00))  # 1 

# nan和任何值的计算都是nan,可用sum()来判断数组中是否有nan
np.sum(arr00)  # nan

统计函数

# 以下函数均可指定axis参数计算某个方向的统计值
arr10 = np.array([[0, 1, 2], [3, 4, 5]])
np.sum(arr10, axis=1)  # 求和, [ 3 12]
np.mean(arr10)  # 均值, 2.5
np.median(arr10)  # 中值, 2.5
np.max(arr10)  # 最大值, 5
np.min(arr10)  # 最小值, 0
np.ptp(arr10)  # 极值(max-min), 5
np.std(arr10)  # 标准差, 1.707825127659933

深拷贝与浅拷贝

# 深拷贝(默认赋值操作)
arr20 = np.array([[0, 0, 0], [0, 0, 0]])
arr21 = arr20  # arr20的地址和值完全给了arr21
arr21[0] = 1  # arr21数据改变
print(arr20)  # arr20的数据也变
# arr21: [[1 1 1] [0 0 0]]
# arr20: [[1 1 1] [0 0 0]]
# 浅拷贝
arr22 = np.array([[0, 0, 0], [0, 0, 0]])
arr23 = arr22.copy()  # arr23仅仅复制了arr22的值,没有保存地址
arr23[0] = 1  # arr23值改变
print(arr22)  # 不影响arr22
# arr23: [[1 1 1] [0 0 0]]
# arr22: [[0 0 0] [0 0 0]] 

数据类型

数据类型dtype:

类型说明
int324个字节的int
int81个字节的int
bool布尔
float648字节的float

语法

arr = np.array(range(4))

# 获取数据类型
arr.dtype  # int32

# 指定数据类型
arr0 = np.array(range(5), dtype='int8')  # 指定为int8

# 改变数据类型
arr1 = arr.astype('bool')  # 返回值为bool类型的arr

# 小数的操作
arr2 = np.array([random.random() for i in range(10)])
arr3 = np.round(arr2, 2)  # 保留两位小数

文件读取

方法

  • 读取文件: np.loadtxt(path, delimiter, dtype, unpack),参数:
    • path:文件路径,可为.txt,.csv
    • delimiter:按照哪种分隔符将文件的数据分开
    • dtype:展示的数据类型,如果数字较大默认用科学计数法
    • unpack:转置数组,默认为False

示例

data = np.loadtxt('resource/data.csv', delimiter=",", dtype=int, unpack=True)
print(data)

在这里插入图片描述

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值