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 展示结果,下同
嵌套列表转为多维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))
使用 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)
- 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)
- 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)
随机数生成
使用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)
- 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)
- np.random.randn()
import numpy as np
x1 = np.random.randn(3,2)
x2 = np.random.randn()
print(x1)
print(x2)
- 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)
- 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)
- np.random.random(size)
size:int 型的元组,不提供则返回一个服从该分布的随机数
import numpy as np
x1 = np.random.random((3,2))
x2 = np.random.random()
print(x1)
print(x2)
数组对象的属性
属性 | 说明 |
---|---|
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)
数组的类名和类型
类型 | 说明 |
---|---|
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)
轴(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 轴
- 二维数组的轴
- 三维数组的轴
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]) # 返回列数,即每行有几个元素
转置
- 二维数组
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')
- 三维数组
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)
数组转换
- 将数组转化为一维数组
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)
- 数组向列表的转换
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)
数组计算
数组和数的计算
- 加减乘除,以加为例
import numpy as np
x = np.array([1,4,9,16]).reshape((2,2))
print(x)
x1 = x+1
print(x1)
- 计算数组所有元素的乘积
import numpy as np
x = np.array([1,4,9,16]).reshape((2,2))
print(x)
x1 = np.product(x)
print(x1)
数组与数组的计算
- 同 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)
- 不同纬度数组计算-行列不同,遵循广播机制
numpy中的广播机制:https://blog.csdn.net/yaohaishen/article/details/119350677
- 矩阵乘法(点乘)
Python 之 numpy 和 tensorflow 中的各种乘法(点乘和矩阵乘):https://www.cnblogs.com/liuq/p/9330134.html
矩阵乘法必须满足矩阵乘法的条件,即第一个矩阵的列数等于第二个矩阵的行数。 矩阵乘法的函数为 dot
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))
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])
- 二维数组
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],:]) # 打印第一行和第三行
- 三维数组
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 行全部的元素
- 行列交换
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)
- 布尔索引
import numpy as np
x = np.arange(1,7).reshape(2,3)
print(x,'\n')
x[x<4] = 1 # 把 x 中小于 4 的数字替换为 1
print(x)
数组的拆分与合并
函数 | 说明 |
---|---|
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))
- 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]))
- 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]))
- 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]))
- 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])
二维数组 - 必须均等分,否则报错
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))
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
- 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))
二维数组有两个坐标,两个数组,小于 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))
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)
数组的读取和存储
- 文本文件的存取 - 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)
- 以二进制格式存储 - 后缀名为.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)
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)