数据分析数值计算之numpy

思维导图

在这里插入图片描述

一、NumPy 介绍

NumPy(Numerical Python)是Python的⼀种开源的数值计算扩展。提供多维数组对象,各种派⽣对象(如掩码数组和矩阵),这种⼯具可⽤来存储和处理⼤型矩阵,⽐Python⾃身的嵌套列表(nested list structure)结构要⾼效的多(该结构也可以⽤来表示矩阵(matrix)),⽀持⼤量的维度数组与矩阵运算,此外也针对数组运算提供⼤量的数学函数库,包括数学、逻辑、形状操作、排序、选择、输⼊输出、离散傅⽴叶变换、基本线性代数,基本统计运算和随机模拟等等。

⼏乎所有从事Python⼯作的数据分析师都利⽤NumPy的强⼤功能。

  • 强⼤的N维数组
  • 成熟的⼴播功能
  • ⽤于整合C/C++和Fortran代码的⼯具包
  • NumPy提供了全⾯的数学功能、随机数⽣成器和线性代数功能

1.1安装

pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

1.2引用

import numpy as np

二、掌握 NumPy 数组对象 ndarray

NumPy最核心的数据类型是N维数组(The N-dimensional array(ndarry))。

  1. NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。

  2. 数组:数组(Array)是有序的元素序列,在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。这些有序排列的同类数据元素的集合称为数组

在这里插入图片描述

python列表和Numpy数组的区别  
1. 列表list与数组array的定义:
	列表是由一系列按特定顺序排列的元素组成,可以将任何东西加入列表中,其中的元素之间没有任何关系;Python中的列表(list)用于顺序存储结构。它可以方便、高效的的添加删除元素,并且列表中的元素可以是多种类型。
    数组也就是一个同一类型的数据的有限集合。
2. 列表list与数组array的相同点:都可以根据索引来取其中的元素;

3. 列表list与数组array的不同点:
    a.列表list中的元素的数据类型可以不一样。数组array里的元素的数据类型一般是一样的;
    b.列表list不可以进行数学四则运算,数组array可以进行数学四则运算; 

2.1区分列表和数组

import numpy as np
# 定义一个列表
a=[1,2,3,4]
print(a[0])
arr=np.array((1,2,3,4))
print(arr[0])
# # 数组的加法
print(arr+arr)
# # 数据的乘法
print(arr*6)

list1=[1,2,3,4]
list2=[2,3,4,5]
print(list1+list2)
for q,r in zip(list1,list2):
    print(q+r)
data=[q+r for q,r in zip(list1,list2)]
print(data)
arr1=np.array(list1)
arr2=np.array(list2)
print(arr1*9)

2.2创建数组函数

numpy.zeros(shape, dtype=float) 创建指定大小的数组,数组元素以 0 来填充
numpy.ones(shape, dtype=float) 创建指定形状的数组,数组元素以 1 来填充

参数描述
shape: 指定行列数(通过list,tuple 的形式均可)
dtype: 数据类型,可选

扫描二维码关注公众号,回复: 15357981 查看本文章
import numpy as np
#3行3列为0的整型数组
print(np.zeros((3,3),dtype = int))
#3行3列为1的整型数组
print(np.ones((3,3),dtype=int))

2.3用已有数据创建数组 — 数据类型转换

numpy.asarray(a, dtype = None)
numpy.array(object, dtype = None)

参数描述
a 或 object : 任意形式的输入参数,可以是,列表, 元组, 可以多维
dtype: 数据类型,可选

主要区别就是当数据源是ndarray时 asarray为浅拷贝(原数据变化后,新数组也变化),array 为深拷贝(原数据变化后,新数组不变化)

# 验证np.array 与 np.asarray 的区别,np.asarray为浅拷贝
arr1 = np.ones((3,3),dtype=int)
asarr = np.asarray(arr1) 
ar_arr1 = np.array(arr1)
arr1[1] =2
print(arr1)
print(asarr)
print(ar_arr1)

2.4 从数值范围创建数组

numpy.arange(start, stop, step, dtype)

参数描述
start:起始值,默认为0
stop:终止值(不包含)
step:步长,默认为1
dtype:返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
start:序列的起始值
stop:序列的终止值,如果endpoint为true,该值包含于数列中
num:要生成的等步长的样本数量,默认为50
endpoint:该值为 true 时,数列中包含stop值,反之不包含,默认是True。
retstep:如果为 True 时,生成的数组中会显示间距,反之不显示。
dtype:ndarray 的数据类型

#创建10到100 并且步长为10的数组(同切片一样包含开始,不包含结束)
arr1 = np.arange(10,100,10)
print(arr1)
#指定区间均匀分割创建数组
arr2 = np.linspace(10,100,10,endpoint=True,dtype=int)
print(arr2)

2.5利用随机函数创建数组

numpy.random.rand() 0-1之间均匀分布的浮点数
numpy.random.randn() 标准正态分布 (均值为0,标准差为1)
numpy.random.randint(low,high,size) 依据形状用low ~high 区间的数值创建数组
numpy.random.uniform(low, high, size) : 产生均匀分布的数组,起始值为low,high为结束值,size为形状
numpy.random.normal(loc, scale, size) : 产生正态分布的数组, loc为均值,scale为标准差,size为形状

概率论统计学中,均匀分布也叫矩形分布,它是对称概率分布,在相同长度间隔的分布概率是等可能的

#1.创建2行3列的0-1之间均匀分布浮点数
arr1 = np.random.rand(2,3)
print("0-1间均匀分布\n",arr1)
#2.创建3行3列的标准正态分布的浮点数
arr2 = np.random.randn(3,3)
print("正态分布\n",arr2)
#3.创建3,3列10-100之间的整数
arr3 = np.random.randint(10,100,(3,3))
print("10-100整数\n",arr3)
#4.创建3,3列均值80,标准差10的正态分布
arr5 = np.random.normal(80,10,(3,3))
print("均值为80,标准差为10的浮点数\n",arr5)

三、数组属性

3.1 数组属性

arr.dtype 元素类型
arr.ndim 数组维度
arr.shape 数组形状
arr.size 元素个数 等价于 len(list)

import numpy as np
arr1 = np.array([[1,2,3],[4,5,6]])
print("dtype",arr1.dtype)
print("ndim",arr1.ndim)
print("shape",arr1.shape)
print("size",arr1.size)

3.2 修改数组维度

arr.reshape(shape) 复制数组后改变形状

arr.resize(shape) 不复制,改变当前数组形状

numpy.ravel(arr1) 展开数组,变成1维

#1.创建一个1-40连续的数组维度为5行8列 名为update
update = np.arange(1,41).reshape((5,8))
update
#2.把数组update 改为8行5列
update.resize((8,5))  
#或者
update = update.reshape((8,5))

3.3 数组访问与修改

ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样[开始:结束:步长]。
ndarray 数组可以基于 0 - n 的下标进行索引

与list, tuple 切片操作一致
一维数组[元素下标]
二维数组[第一个维度(行), 第二个维度(列)] 适合切片

# 一维数组的访问
arr=np.arange(10)
print(arr)
# 访问单个值
print(arr[3])
print(arr[-1])
# 访问范围
print(arr[2:8])
print(arr[8:2:-2])
# 数组的修改
arr[2:4]=10,11
print(arr)


import numpy as np
# 创建二维数组
arr=np.arange(12).reshape(3,4)
print(arr)
# 对于行列都有要求
print(arr[0:2,1:3])
# 按照行的条件选择数据
print(arr[0:2])
# 按照列选择数据
print(arr[:,2:4])

3.4 利用True,False 进行访问与修改

通过相等形状的元素为True,False 的数组对数据进行获取

  • 通过对数组进行判断的形式得到相同形状的True,False 数组
ar = np.arange(1,21).reshape((4,5))
print(ar)
# 5的倍数
print(ar[ar % 5==0])
# 奇数
print(ar[ar % 2==1])
# 偶数
print(ar[ar % 2==0])

四、Numpy 常用函数

4.1 算数函数

  • np.power(arr1,arr2或常数) == 等价于 **

  • np.modf(arr) #分开整数部分和小数部分

  • np.sqrt(arr) 对数组进行开方

  • np.around(arr,小数点位数) 4舍5入后保留指定位数的小数点

  • np.floor(arr) 向下取整 6.9 = 6

  • np.ceil(arr) 向上取整 6.1 = 7

  • np.sign(arr) 取符号,正数为 1, 0, 负数为-1

练习

  1. 创建3行4列的一个数组,内容为标准正态分布的值,数组命名为arr_fun_ex
  2. 对数组arr_fun_ex 第一行进行4舍5入并保留2为小数点
  3. 对数组arr_fun_ex 第二行进行向上取整
  4. 对第一行第3列数进行开方
  5. 对每个元素乘以3后取整数部分
import numpy as np
import warnings
warnings.filterwarnings('ignore')
#1 创建3行4列的一个数组,内容为标准正态分布的值,数组命名为arr_fun_ex
arr_fun_ex = np.random.normal(size=(3,4))
arr_fun_ex
#2 对数组arr_fun_ex 第一行进行4舍5入并保留2为小数点
arr_fun_ex[0] = np.around(arr_fun_ex[0],2)
#3  对数组arr_fun_ex 第二行进行向上取整
arr_fun_ex[1] = np.ceil(arr_fun_ex[1])
#4 对第一行第3列数进行开方
arr_fun_ex[0,2] = np.sqrt(arr_fun_ex[0,2])
#6 对每个元素乘以3后取整数部分
np.modf(arr_fun_ex * 3)[1]

4.2 统计函数

在这里插入图片描述

函数 说明
sum 计算数组的和
mean 计算数组均值
std 计算数组标准差
var 计算数组方差
min 计算数组最小值
max 计算数组最大值
argmin 返回数组最小元素的索引
argmax 返回数组最大元素的索引
cumsum 计算所有元素的累计和
cumprod 计算所有元素的累计积
import numpy as np
# 使用numpy进行统计分析
arr=np.arange(20).reshape(4,5)
print(arr)
# 求整个数组的总和
print(arr.sum())
# 计算每一行数据的和
print(arr.sum(axis=1))
# 计算每一列数据的和
print(arr.sum(axis=0))

# 计算数据的累积和
print(np.cumsum(arr))
# 按列计算数据累积和
print(np.cumsum(arr,axis=0))
# 计算数据的累积积
print(np.cumprod(arr))
# 按行计算
print(np.cumprod(arr,axis=1))

# 得到最大元素的索引位置
print(np.argmax(arr))
print(np.argmax(arr,axis=0))
# 得到最小元素的索引位置
print(np.argmin(arr))
print(np.argmin(arr,axis=1))

4.3其他函数

numpy.where(条件,True_value,False_Value) #满足条件,返回True_value,否则返回 False_value
np.apply_along_axis(函数名/匿名函数,轴,arr=数组)

np.random.seed(123)
ar = np.random.randint(10,100,(3,4))
ar
#  语文 数学 英语 化学
# [[76, 27, 93, 67],
#  [96, 57, 83, 42],
#  [56, 35, 93, 88]]
#1,为成绩分段 60 及格 ,60-90 一般,>90优秀
np.where(ar<60,"不及格",np.where(ar<90,"一般","优秀"))
#2,每人的总分
ar.sum(axis= 1)
#3, 语文最低分的人英语分数
ar[ar[:,0] ==ar[:,0].min() ,2]
#4,每科的平均分
ar.mean(axis=0)
#5, 每个人的文理平均分
ar[:,[0,2]].mean(axis=1)
ar[:,[1,3]].mean(axis=1)

np.apply_along_axis(lambda hang:
                    [hang[[0,2]].mean(),hang[[1,3]].mean()]
                    ,axis=1,arr=ar)

猜你喜欢

转载自blog.csdn.net/weixin_52201738/article/details/125278649