Python数据分析-NumPy基础

NumPy基础教程:https://www.jianshu.com/p/45417c05574c

ndarray数组

导入函数统一使用:import numpy as np

创建数组

从已有类型创建 ndarray 数组

import numpy as np
ls1 = [1,4,9,16]
x = np.array(ls1)
print(x)
print(type(x))

用 PyCharm 展示结果,下同

image-20220124103229232

嵌套列表转为多维ndarray数组,嵌套列表元素数不一样的话,转换数组的时候要加dtype=object,不然会报警告

import numpy as np
ls2 = [[1,4,9,16],[0,1,-1,2]]
x = np.array(ls2)
print(x)
print(type(x))
ls3 = [[1,4,9,16],[0,1,-1]]
y = np.array(ls3,dtype=object)
print(y)
print(type(y))
image-20220124104426098

使用 NumPy 创建 ndarray 数组

函数 说明
np.arange(n) 类似 range() 函数,返回 ndarray 类型,元素从 0 到 n-1
np.ones(shape) 根据 shape 生成一个全 1 数组,shape 是元组类型
np.zeros(shape) 根据 shape 生成一个全 0 数组,shape 是元组类型
np.eye(n) 创建一个正方的 n*n 单位矩阵,对角线是 1,其余为 0
np.linspace() 根据起止数据等间距的填充数据,形成数组
  • arange()

用法:np.arange(start, stop, step, dtype=None)

start:起始点,可选项,默认为0

stop:结束点

step:步长,默认为1,当指定step时,必须给出start

dtype:数组的类型,未指定的话自行根据输入参数推断

import numpy as np
x = np.arange(3)
print(x)
x1 = np.arange(1,5,2)
print(x1)
image-20220124111606780
  • ones(),zeros(),eye()

ones() 和 zeros() 使用方式相同,根据设置的行列参数生成数组,eye() 根据设置的单位矩阵大小生成数组

import numpy as np
x = np.ones(4,dtype=int) # 一维数组
x1 = np.ones((2,2)) # 二维数组
print(x)
print(x1)
x2 = np.eye(3)
print(x2)
image-20220124121107311
  • linspace()

用法:np.linspace(start, stop, num = 50, endpoint = True, retstep = False, dtype = None)

start:起始点

stop:结束点,与 endpoint 参数有关,endpoint 为 True 时,包含 stop 的值,endpoint 为 False 时则不含

num:生成样本数量,非负整数,可选

endpoint:设置是否包含 stop,默认为 True

retstep:显示数组形成元素之间的步长

dtype:数据类型

import numpy as np
x = np.linspace(1, 10, num = 5)
print(x)
x1 = np.linspace(1, 10, num = 5, endpoint = True)
x2 = np.linspace(1, 10, num = 5, endpoint = False)
print(x1)
print(x2)
x3 = np.linspace(1, 10, num = 5, retstep = True)
x4 = np.linspace(1, 10, num = 5, retstep = False)
print(x3)
print(x4)
image-20220124131622567

随机数生成

使用numpy产生随机数:https://www.cnblogs.com/sench/p/9683905.html

函数 说明
rand() 返回指定形状的数组,数组中的值服从 [0,1) 之间的均匀分布
uniform() 返回在给定区间内产生均匀分布的数组
randn() 返回指定形状的数组,数组中的值服从标准正态分布
normal() 返回一个由 size 指定形状的数组,数组中的值服从 μ=loc,σ=scale 的正态分布。
randint() 返回给定区间内离散均匀抽样的数组
random() 返回从 [0, 1) 之间均匀抽样的数组
  • np.random.rand()

如果没有参数则返回一个 float 型的随机数,该随机数服从 [0, 1) 之间的均匀分布

import numpy as np
x1 = np.random.rand(3,2)
x2 = np.random.rand()
print(x1)
print(x2)
image-20220124152446127
  • np.random.uniform(low, high, size = None)

不提供 size,则返回一个该分布的随机数

import numpy as np
x1 = np.random.uniform(1,3,(2,3))
x2 = np.random.uniform(1,3)
print(x1)
print(x2)
image-20220124165003513
  • np.random.randn()
import numpy as np
x1 = np.random.randn(3,2)
x2 = np.random.randn()
print(x1)
print(x2)
image-20220124173443841
  • np.random.normal(loc, scale, size = None)

loc:浮点数类型,指定均值 μ

scale:浮点数类型,指定标准差 σ

size:整数元组指定数组的形状,不提供 size 且 loc 和 scale 为标量,则返回一个服从该分布的随机数。

import numpy as np
x1 = np.random.normal(1,3,(3,2))
x2 = np.random.normal(1,3)
print(x1)
print(x2)
image-20220124174345456
  • np.random.randint(low, high, size, dtype)

low, high:int 型,指定抽样区间

size:int 型元组,指定形状。不提供 size 则返回一个服从该分布的 int 型随机函数

dtype:可选参数,指定数据类型,默认是 int 型

import numpy as np
x1 = np.random.randint(1,5,(3,2))
x2 = np.random.randint(1,5)
print(x1)
type(x1)
print(x2)
image-20220127153611250
  • np.random.random(size)

size:int 型的元组,不提供则返回一个服从该分布的随机数

import numpy as np
x1 = np.random.random((3,2))
x2 = np.random.random()
print(x1)
print(x2)
image-20220127161555000

数组对象的属性

属性 说明
ndim 秩,即轴的数量或维度的数量
shape ndarray 对象的尺度,对于矩阵,n 行 m 列
size ndarray 对象元素的个数,相当于 shape 中 n*m 的值
dtype ndarray 对象的元素类型
itemsize ndarray 对象中每个元素的大小,以字节为单位
import numpy as np
x = np.array([1,4,9,16]).reshape((2,2)) # reshape 更改数组的形状
print(x)
print(x.ndim)
print(x.shape)
print(x.size)
print(x.dtype)
print(x.itemsize)
image-20220127165415279

数组的类名和类型

类型 说明
int8、uint8 有符号和无符号的 8 位(1 个字节)整型
int16、uint16 有符号和无符号的 16 位(2 个字节)整型
int32、uint32 有符号和无符号的 32 位(4 个字节)整型
int64、uint64 有符号和无符号的 64 位(8 个字节)整型
float16 半精度浮点数
float32 标准的单精度浮点数
float64 标准的双精度浮点数
float128 扩展精度浮点数
complex64、complex128、complex256 分别用两个 32 位、64 位或 128 位浮点数表示的复数
bool 存储 True 和 False 值的布尔类型
import numpy as np 
x = np.array(np.random.random((3,2)),dtype=float) # 指定生成数组类型为浮点数
print(x)
print(x.dtype)
x1 = np.round(x,2) # 修改浮点数的小数位数,保留 2 位
print(x1)
print(x1.dtype)
x2 = x.astype(np.int32) # 更改数组的数据类型
print(x2)
print(x2.dtype)
image-20220209101850885

轴(axis)

一维数组只有一个 0 轴

二维数组 (shape(2, 2)) 有 0 轴和 1 轴,每行为 1 轴,每列为 0 轴

三维数组 (shape(2, 2, 3)) 有 0 轴,1 轴和 2 轴,行为 2 轴,列为 1 轴,不同数组之间为 0 轴。类似空间坐标,x 轴为 2 轴,y 轴为 1 轴,z 轴为 0 轴

  • 二维数组的轴
image-20220120131410007
  • 三维数组的轴
image-20220120131536500
import numpy as np
x = np.arange(1,7,1).reshape((2,3))
print(x)
print(x.shape[0]) # 返回行数,即有几行
print(x.shape[1]) # 返回列数,即每行有几个元素
x1 = np.arange(1,25,1).reshape(2,3,4)
print(x1)
print(x1.shape[0]) # 返回有几个数组
print(x1.shape[1]) # 返回行数,即有几行
print(x1.shape[2]) # 返回列数,即每行有几个元素
image-20220215160128963

转置

  • 二维数组

transpose 变换轴,与参数的位置有关;swapaxes 也是变换轴,与参数的位置无关但是必须有参数,不能省略。x.transpose() 和 x.T 只适用于二维数组

import numpy as np
x = np.arange(1,7,1).reshape((2,3))
print(x, end = '\n\n')
print(x.transpose((1,0)), end = '\n\n') # 跟 x.transpose() 和 x.T 一个结果
print(x.transpose((0,1)), end = '\n\n') # 未转置
print(x.swapaxes(0,1), end = '\n\n')
print(x.swapaxes(1,0), end = '\n\n')
image-20220211165915362
  • 三维数组

transpose 变换轴,与参数的位置有关。三维数组使用 transpose 函数必须指定三个轴的参数;swapaxes变换轴,指定转换参数两个轴的元素。

import numpy as np
x = np.arange(1,28,1).reshape((3,3,3))
print(x.transpose((0,1,2))) 
print(x.transpose((1,0,2)))
print(x.transpose((1,2,0)))
print(x.swapaxes(0,1))  

三维数组类似空间坐标,从 0 开始记第一位,numpy三维数组先记 z 轴,再记 y 轴,最后记 x轴,即 (z, y, x) → (0轴, 1轴, 2轴)

每个人对空间坐标的 x,y,z 有不同的理解方法,这里以空格间隔的各个数组记为单个数组,单个数组的行为 x 轴即 2 轴,单个数组的列为 y 轴即 1 轴,不同数组组成 z 轴即 0 轴

如下图,以元素 6 为例,x.transpose ((0,1,2)) 与最初生成的 x 数组顺序一致,6 在第 1 个数组第二行的第三个元素,即坐标为 (0,1,2);

x.transpose((1,0,2)) 将 x 数组的 1 轴和 0 轴的转换,即将 1 轴和 0 轴的坐标转换,6 的坐标转换为(1,0,2)

x.transpose((1,2,0)) 将 x 数组的原 1 轴的坐标放到 z 轴,2 轴的坐标放到 y 轴,0 轴的坐标放到 x 轴,即 6 的坐标转换为 (1,2,0)

image-20220215144409613

数组转换

  • 将数组转化为一维数组
import numpy as np
x = np.array([1,4,9,16]).reshape((2,2))
print(x)
x1 = x.reshape(4) 
print(x1)
x2 = x.flatten() # 将数组展开
print(x2)
image-20220211152115108
  • 数组向列表的转换
import numpy as np
x = np.array([1,4,9,16]).reshape((2,2))
print(x)
x1 = x.reshape(4) 
print(x1)
x2 = x.tolist()
print(x2)
x3 = x1.tolist()
print(x3)
image-20220211152737254

数组计算

数组和数的计算

  • 加减乘除,以加为例
import numpy as np
x = np.array([1,4,9,16]).reshape((2,2))
print(x)
x1 = x+1
print(x1)
image-20220215153859746
  • 计算数组所有元素的乘积
import numpy as np
x = np.array([1,4,9,16]).reshape((2,2))
print(x)
x1 = np.product(x)
print(x1)
image-20220215154823184

数组与数组的计算

  • 同 shape 数组计算 - 行列相同,元素与元素对应计算
import numpy as np
x1 = np.arange(1,5).reshape(2,2)
x2 = np.arange(5,9).reshape(2,2)
print(x1)
print(x2)
x3 = x1+x2
x4 = x1*x2
print(x3)
print(x4)
image-20220215163112868
  • 不同纬度数组计算-行列不同,遵循广播机制

numpy中的广播机制:https://blog.csdn.net/yaohaishen/article/details/119350677

image-20220216092404872
  • 矩阵乘法(点乘)

Python 之 numpy 和 tensorflow 中的各种乘法(点乘和矩阵乘):https://www.cnblogs.com/liuq/p/9330134.html

矩阵乘法必须满足矩阵乘法的条件,即第一个矩阵的列数等于第二个矩阵的行数。 矩阵乘法的函数为 dot

image-20220216095059966
import numpy as np
x1 = np.arange(1,7).reshape(2,3)
x2 = np.arange(2,8).reshape(3,2)
print(x1,'\n\n',x2,'\n\n')
print(x1.dot(x2))
image-20220216095701207

numpy 索引和切片

Numpy对数组按索引查询:https://www.cnblogs.com/zhjblogs/p/14664306.html

从 0 起始算第一位,取范围的时候包含左边的数不包含右边的数

  • 一维数组
import numpy as np 
x = np.arange(1,7)
print(x)
print(x[1])
print(x[0:2])
print(x[:4])
print(x[:-1])
image-20220216105742610
  • 二维数组
import numpy as np
x = np.arange(1,13).reshape(3,4)
print(x,'\n')
print(x[1,2]) 
print(x[1],'\n') # 打印第二行
print(x[:1,:-1],'\n') # 逗号分隔行列取值范围
print(x[:,2],'\n') # 打印所有行的第三列
print(x[[0,2],:]) # 打印第一行和第三行
image-20220216130547992
  • 三维数组
import numpy as np
x = np.arange(1,25).reshape(2,3,4)
print(x,'\n')
print(x[0,1,2],'\n') # 打印第一个数组第二行第三个元素
print(x[0:2,1:3,:]) # 打印前两个数组第 2,3 行全部的元素
image-20220216131047644
  • 行列交换
import numpy as np
x = np.arange(1,13).reshape(3,4)
print(x,'\n')
x[[1,2],:] = x[[2,1],:] # 第 2 行与第 3 行交换
print(x,'\n')
x[:,[0,2]] = x[:,[2,0]] # 第 1 列与第 3 列交换
print(x)
image-20220216133341457
  • 布尔索引
import numpy as np
x = np.arange(1,7).reshape(2,3)
print(x,'\n')
x[x<4] = 1  # 把 x 中小于 4 的数字替换为 1
print(x)
image-20220216132620152

数组的拆分与合并

函数 说明
np.concatenate([x,y]) 最一般化的连接,沿一条轴连接一组数组,用参数 axis 设定轴
np.vstack([x,y]) 竖直拼接
np.hstack([x,y]) 水平拼接
np.dstack([x,y]) 合并成多维数组
np.split(x,y) 沿指定轴在指定位置拆分数组
  • concatenate(),数组 shape 相同才可以连接
import numpy as np
x1 = np.arange(2,6).reshape(2,2)
x2 = np.arange(1,5).reshape(2,2)
print(np.concatenate([x1,x2],axis=0),'\n') # 默认即为 axis=0
print(np.concatenate([x1,x2],axis=1))
image-20220216142247255
  • vstack() - 竖直拼接,数组每行元素个数相同才能拼接,否则报错
import numpy as np
x1 = np.arange(1,7).reshape(2,3)
x2 = np.arange(7,13).reshape(2,3)
x3 = np.arange(13,16)
print(np.vstack([x1,x2]),'\n')
print(np.vstack([x1,x3]))
image-20220216151035942
  • hstack() - 水平拼接,数组行数要一样,否则报错
import numpy as np
x1 = np.arange(1,7).reshape(2,3)
x2 = np.arange(7,13).reshape(2,3)
print(np.hstack([x1,x2]))
image-20220216154408476
  • dstack() - 合并成多维数组,需要合并的每个数组的 shape 要一样,否则报错
import numpy as np
x1 = np.arange(1,7).reshape(2,3)
x2 = np.arange(7,13).reshape(2,3)
print(np.dstack([x1,x2]))
image-20220216154917474
  • split() - 拆分数组

一维数组

import numpy as np
x1 = np.arange(1,10)
print(np.split(x1,3))
print(np.split(x1,[3,7]))
x2 = np.split(x1,3)
print(x2[1])
image-20220218085455272

二维数组 - 必须均等分,否则报错

import numpy as np
x1 = np.arange(1,9).reshape(2,4)
print(x1)
print(np.split(x1,2))
print(np.split(x1,2,axis=1))
image-20220218090554794

where 函数

  • np.where(condition, x, y) - 满足条件 condition,输出 x,不满足输出 y
import numpy as np
x = np.arange(1,10).reshape(3,3)
print(x,'\n')
print(np.where(x<5,0,1)) # 小于5的改为0,大于的改为1
image-20220218101920008
  • np.where(condition) - 只有条件,没有 x 和 y,则输出满足条件(即非 0 )元素的坐标
import numpy as np
x = np.arange(1,10).reshape(3,3)
print(x,'\n')
print(np.where(x<5))
image-20220218105619448

二维数组有两个坐标,两个数组,小于 5 的元素坐标一一对应,分别为 (0,0),(0,1),(0,2),(1,0) 即第一行的三个元素和第二行的第一个元素

take 函数

np.take(a, indices, axis=None, out=None, mode='raise')

import numpy as np
x = np.arange(1,10).reshape(3,3)
print(x,'\n')
print(x.take(indices=1,axis=0)) # 沿 0 轴取第 2 行
print(x.take(1,0))
print(x.take(indices=1,axis=1)) # 沿 1 轴取第 2 列
print(x.take(1,1))
image-20220218134112404

numpy 中的 nan 和 inf

nan(NAN, Nan):not a number 表示不是一个数字。当读取本地文件为 float 的时候,如果有缺失,就会出现 nan。在数据分析中,nan 常被用作数据缺失值

inf(inf, -inf):infinity,inf 表示正无穷,-inf 表示负无穷。当做一个不合适的计算的时候会出现

import numpy as np
x = np.arange(1,10,dtype=float).reshape(3,3)
x[x<5] = np.nan
print(x)
# 判断数组中 nan 的个数
print(np.count_nonzero(x!=x))
print(np.count_nonzero(np.isnan(x)))
# 将数组中的 nan 替换成 0
x[np.isnan(x)] = 0
print(x)
image-20220218141650446

数组的读取和存储

  • 文本文件的存取 - savetxt() 和 loadtxt() 函数,只能读写一、二维数组
import numpy as np
x = np.arange(1,7).reshape(2,3)
np.savetxt("test.txt",x)
x1 = np.loadtxt("test.txt")
print(x1)
image-20220218160712149
image-20220218160409382
  • 以二进制格式存储 - 后缀名为.npy
import numpy as np
x = np.arange(1,28).reshape(3,3,3)
np.save("test",x)
x1 = np.load("test.npy")
print(x1)
image-20220218162911265

NumPy 常用函数

函数 说明
np.abs(x) 计算数组各元素的绝对值
np.sqrt(x) 计算数组各元素的平方根
np.square(x) 计算数组各元素的平方
np.log(x),np.log10(x),np.log2(x) 计算数组各元素的自然对数,10 底对数和 2 底对数
np.ceil(x),np.floor(x) 计算数组各元素的 ceiling 值(向上取整)或 floor 值(向下取整)
np.rint(x) 计算数组各元素的四舍五入值
np.modf(x) 将数组各元素的小数和整数部分以两个独立数组的形式返回
np.exp(x) 计算数组各元素的指数值
np.sign(x) 计算数组各元素的符号值
x.sum(axis=None) 计算数组各元素的和
x.mean(x, axis=None) 计算数组的均值,受离群点的影响较大
np.average(x, weights=t) 求数组的加权平均值
np.median(x, axis=None) 求数组的中值
np.maximum(x, y, out=None) x 与 y 逐位比较取其大者;至少接受两个参数
np.maximum(x, y, out=None) x 与 y 逐位比较取其小者;至少接受两个参数
x.max(axis=None),x.min(axis=None) 求数组的最大/小值
np.ptp(x,axis=None) 求数组的极值,即最大值和最小值之差
np.var(x) 计算数组的方差。当 ddof 参数为 0 时,计算偏样本方差;当 ddof 为 1 时,计算无偏样本方差,默认值为 0
x.std(axis=None) 求数组的标准差
np.argmax(x),np.argmin(x) 获取最大值最小值的位置,可以用 axis 参数设置轴
np.unique(x) 计算 x 中的唯一元素,并返回有序结果
np.intersect1d(x, y) 计算 x 和 y 中的公共元素,并返回有序结果
np.union1d(x, y) 计算 x 和 y 的并集,并返回有序结果
np.setdiff1d(x, y) 集合的差,即元素在 x 中且不在 y 中
import numpy as np
x = np.array([1,4,9,16]).reshape((2,2))
print(x)
x1 = np.sqrt(x)
print(x1,x1.dtype)
image-20220215150153516
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容