NumPy是一个Python包,它是一个由多维数组对象和用于处理数组的例程集合组成的库。
通过Numpy,可以进行如下操作:
现在一般通过Numpy、Scipy(Scientific Python)和Matplotlib(绘图库)结合来替代MatLab,是一个流行的技术计算平台。
numpy方法 | 解释 |
---|---|
np.dtype | 指定当前numpy对象的整体数据, 见下一个表格 |
np.itemsize | 对象中每个元素的大小, 单位字节 |
np.size | 对象元素的个数, 相当于np.shape中的n*m值 |
np.shape | 轴, 查看数组形状, 对于矩阵, n行m列 |
np.ndim | 秩 |
np.isnan(list) | 筛选出nan值 |
np.iscomplex(list) | 筛选出非复数 |
~ | 取补运算符 |
np.array(数组, dtype=np.bool) | 自定义数组类型 |
np.astype(np.bool) | 转换数组类型 |
np.mat() | 将python 列表转化成矩阵 |
np.mat().getA() | 将matrix对象转成ndarray对象 |
np.matrix() | 同上 |
np.asmatrix() | 将ndarray对象转成matrix对象 |
np.tile() | 重复某个数组。比如tile(A,n),功能是将数组A重复n次,构成一个新的数组传送门 |
np.I | 矩阵求逆 |
np.T | 矩阵转置, 行变列, 列变行, 对角线翻转矩阵 |
np.tolist() | 转换成python列表, 用于和python原生结合写程序 |
np.multiply(x, y) | 矩阵x 矩阵y相乘 |
np.unique() | 数组驱虫, 并且从小到大生成一个新的数组 |
np.arange | 同python range() |
np.arange(24).reshape((2, 3, 4)) | 创建一个2维3行4列的数组, 必须能被给定的长度除开, 可以索引和切片 |
np.arange(24).resize((2, 3, 4)) | 同上, 会修改原值 |
np.linspace(x, y, z) | 等间距生成, x起始, y截止, z步长 |
np.ones(x) | 生成都是x的数组, 可传递三维数组, 几行几列, 具体的个数 |
np.zeros(x) | 生成都是0的数组 |
np.full([x, y], z) | 自定义模板数组, 生成x行y列都是z的数组 |
np.eye(x) | 创建一个正方的x*x单位的矩阵, 对角线为1, 其余为0 |
np.flatten() | 数组降维, 不改变 原值 |
np.random.rand(x, y, z) | 生成一个一维x随机数或生成x*y的随机数组 |
np.random.randn(x, y) | 正态分布随机数 |
np.random.randint(low, high, (shape)) | 整数随机数 |
np.random.normal(loc, scale, (size)) | 从指定正态分布中抽取样本, loc为概率分布的均匀值, 标准差scale |
np.random.seed(s) | 给一个随机数字固定 |
np.randomunifrom(low, high, (size)) | 均匀分布的数组, 有小数 |
np.random.shuffle(a) | 将数组a的第0轴(最外维度)进行随机排列(洗牌), 改变数组a, 行边列不变 |
np.random.permutation(a) | 同上, 不改变数组a |
np.random.choice(a, size=None, replace=False, p=数组a/np.sum(b)) | 从一维数组a中以概率p抽取元素,形成size形状新数组,replace表示是否可以重用元素,默认为False,p为抽取概率,本位置越高,抽取概率越高 |
np.sum(axis=None) | 求和, axis=0为列, 1为行 |
np.argsort() | 矩阵每个元素坐标排序 |
np.sort(axix=None) | 从小打大排序 |
-np.sort(axis=None) | 从大到小排序 |
np.sort_values(‘字段’, ascending=False) | 排序,升序排列 |
np.mean(axis=None) | 平均数 |
np.average(axis=None,weights=None) | 加权平均,weights加权值,不设为等权重,例子[10, 5, 1],每列分别X10,X5,X1在/(10+5+1) |
np.var(axis=None) | 方差:各数与平均数之差的平方的平均数 |
np.std(axis=None) | 标准差:方差平方根 |
np.min(axis=None) | 最小值 |
np.argmin(axis=None) | 求数组中最小值的坐标 |
np.median(axis=None) | 中位数 |
np.ptp(axis=None) | 元素最大值与最小值的差 |
np.cumsum() | 累加,cumsum和cumprod之类的方法不聚合,产生一个中间结果组成的数组,默认一维数组,1为按原样 |
np.cumprod() | 累乘 |
np.count_nonzero(arr > 0) | 计数非0值个数,布尔值会被强制转换为1和0,可以使用sum()对布尔型数组中的True值计数 |
np.bools.any() | 测试数组中是否存在一个或多个True |
np.bools.all() | 数组中所有值是否都是True, 测试有没有空值 |
# 创建0-23, 共2个三行四列的数组
a = np.arange(24).reshape((2,3,4))
"""
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
"""
# 一个三维数组,提取12的话,python list是a[1][0][0], ndarange可以是a[1,0,0],也可以是[1][0][0]
# 可以用负数
# a[1,:] 选取第一维数组里面所有
# a[:,1] 选取所有维度,第一行
# a[1,:,3] 选取第一维度数组所有行里的第三个值
# a[:,0:2,1:3] 选取所有维度的第0行到第2行, 取元素第1个到第3个
# a[:,:,::2] 选取所有维度, 所有行, 步长为2的所有行
# -------------------------------------------------------------------------
# 例子,布尔型索引
names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
data = np.arange(28).reshape(7,4)
names[names == 'Bob']
# array(['Bob', 'Bob'], dtype='
names == 'Bob'
# array([ True, False, False, True, False, False, False], dtype=bool)
# 姓名数组可以跟数字数字一一对应
data[names == 'Bob']
# array([[ 0, 1, 2, 3],
# [12, 13, 14, 15]])
# 可以将布尔型数组跟切片、整数、整数序列混合使用
data[names == 'Bob',2:]
# array([[ 2, 3],
# [14, 15]])
# 组合多个布尔型索引,进行逻辑运算
# 组合条件,逻辑运算符:& 且,| 或,非(!= 或 ~)
# 并集,交集
(names == 'Bob') | (names == 'Will')
# array([ True, False, True, True, True, False, False], dtype=bool)
# 且,没有交集
(names == 'Bob') & (names == 'Will')
# array([False, False, False, False, False, False, False], dtype=bool)
--------------------------------------------------------------------------
// 数组修改
a[:,0:2] = 1 # 切片批量修改
a[:,0:2] = [[11,12],[13,14]] # 切片批量修改
names[names == 'Bob'] = 'aaa' # 修改单个
a为数组,a > 1 返回为true的索引
np.where(a > 2) # 返回索引
# (array([0, 0], dtype=int64),
# array([0, 1], dtype=int64),
# array([1, 0], dtype=int64))
# 也可以用作三元表达式,满足条件,返回x,不满足返回y
np.where(条件,x, y)
numpy提供了便捷的内部文件存取,将数据存为np专用的npy(二进制格式)或npz(压缩打包格式)格式
npy格式以二进制存储数据的,在二进制文件第一行以文本形式保存了数据的元信息(维度,数据类型),可以用二进制工具查看查看内容
npz文件以压缩打包文件存储,可以用压缩软件解压
a = np.array([['张三','李四','王五','赵六'],['11','12','13','14','15']])
b = np.arange(24).reshape((2,3,4))
np.save('a.npy',a) # 存为.npy文件``
np.savez("a.npz", ar0 = a, ar1 = b) # 多个数组存入一个.npz压缩包
c = np.load('x.npy') # .npy文件读入数组
d = np.load("y.npz") # .npz压缩包读入
#d["ar0"] # 单独输出数组
import numpy as np
# 二元计算函数
arr1 = np.arange(10).reshape((2,5))
arr2 = np.arange(10,20).reshape((2,5))
print(arr1)
print(arr2)
print(np.add(arr1, arr2)) # 相加操作
print('相减操作')
print(np.subtract(arr2,arr1))
print('除法操作')
print(np.divide(arr1,arr2))
print(np.floor_divide(arr1,arr2)) # 这个除完取整
print(np.mod(arr1,arr2)) # 取余
print('元素相乘')
print(np.multiply(arr1,arr2))
import numpy as np
arr1 = np.arange(4,14).reshape((2,5))
arr2 = np.arange(10,20).reshape((2,5))
# 相当于条件筛选,第一个是条件,第二个是操作数组,第三个是对不符合条件的操作
# 如果写在第二位就是对符合条件进行操作,然后把操作数组写在第三位
print(np.where(arr1%2==0, arr2, arr2*10))
# print(np.where(arr1%2==0)) # 这个只有一个参数,打印的是什么
print(np.where(arr1>arr2, arr1, arr2))
list1 = arr1.tolist()
list2 = arr2.tolist()
list3= [x if x>y else y for x,y in zip(list1, list2)]
print(list3)
print('####################')
nd1 = np.random.uniform(10, 50, (3,4))
print(np.rint(nd1))
# 四舍五入后大于20小于30,这些值改成100
print(np.where((np.rint(nd1)>=30)|(np.rint(nd1)<=20), nd1, 100))
# 如果是空值默认值为0,否则不变
print(np.where(np.isnan(nd1), 0, nd1))
import numpy as np
s1 = {10,20,30,40}
s2 = {10,100,20,200}
#
# print(s1&s2)
# print(s1|s2)
# print(s1-s2)
arr1 = np.arange(10,20)
arr2 = np.arange(0,5)
arr3 = np.array([10,90,30,40,50,10,40])
# 数组去重 还排序
print(np.unique(arr3))
# 数组的交集
print(np.intersect1d(arr1,arr3))
print(np.union1d(arr1,arr2)) # 并集
# 求差集 前后有影响
print(np.setdiff1d(arr1,arr2))
# 求对称差集
print(np.setxor1d(arr1,arr2))