numpy的基础用法

numpy的基础用法

  • 初识Numpy
  • numpy基础用法
  • nparray索引和切片
  • Numpy数据存取
  • numpy二元函数
  • numpy三元函数
  • numpy集合运算

初识Numpy

NumPy是一个Python包,它是一个由多维数组对象和用于处理数组的例程集合组成的库。

通过Numpy,可以进行如下操作:

  • 数组的算数和逻辑运算。
  • 傅立叶变换和用于图形操作的例程。
  • 与线性代数有关的操作,NumPy 拥有线性代数和随机数生成的内置函数。

现在一般通过Numpy、Scipy(Scientific Python)和Matplotlib(绘图库)结合来替代MatLab,是一个流行的技术计算平台。

numpy基础用法

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, 测试有没有空值

nparray索引和切片

# 创建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数据存取

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"]                               # 单独输出数组

numpy二元函数

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))

numpy三元函数

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))

numpy集合运算

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))

你可能感兴趣的:(数据分析)