01-NumPy 数据库

第一部分 基本操作

第一节 数组的创建

1.1.1 使用np.array()

创建数组最简单的方法是使用array函数,将list格式 转换为 ndarray

import numpy as np
l = [1, 2, 3, 4, 5]
arr = np.array(l)   # 将列表转换为numpy 数组
1.1.2 使用特定内置函数
import numpy as np
arr1 = np.ones(10)  # 输出array([1, 1, 1......])
arr2 = np.zeros(10)  # 输出array([0, 0, 0, 0.......])
arr3 = np.full(shape = [2, 3], fill_value = 2.4)  # 输出array([[2.4, 2.4, 2.4],[2.4, 2.4, 2.4]])
arr4 = np.arange(start = 0, stop = 20, step = 2) # 等差数列,输出array([0, 2, 4.....20])
arr5 = np.linspace(start = 0, stop = 9, num = 10) # linspace 线性等分向量, 输出等差数列,可能是小数,array([0, 1, 2...10])
arr6 = np.random.randint(0, 100, size = 10) # int随机数,array([4, 22...24])
arr7 = np.random.randn(5)  # 正太分布,array([0.56, 0.37....2.37,0.32])
arr8 = np.random.random(size = 5)  # float 随机数,array([0.59, 0.37...0.33])

第二节 查看操作

1.2.1 数组的状态查询
import numpy as np
arr = np.random.randint(0, 100, size = (3, 4, 5))
arr.ndim   # 输出 3  # 数组的维度
arr.shape  # 输出(3, 4, 5)  # 数组的形状
arr.size   # 输出 3*4*5 = 60  # 数组的元素总量
arr.dtype  # 输出 dtype('int64')   # 数组的元素类型
arr.itemsize  # 输出 8   # 数据类型为int64, 一个字节为8位,所有64/8 = 8

第三节文件的 IO操作

1.3.1 保存操作

save方法保存ndarray 到npy 文件, 也可以使用 savez将多个 array保存到一个.npz 文件中

x = np.random.randn(5)
y = np.arange(0, 10, 1)
np.save('x_arr', x)  # 使用save可以存一个 ndarray
np.savez('some_array.npz',xarr = x, yarr = y)  # 使用savez 可以同时保存多个数组,保存时以key = value形式保存,读取时用key 进行读取
1.3.2 读取操作

一般的用load方法来读取存储的数据,如果是.npz文件的话,读取之后相当于形成一个key-value类型的变量,通过保存时定义的key 来获取对应的array

np.load('x_arr.npy')  # 直接加载
np.load('some_array.npz')['yarr']
1.3.3 读写csv、txt文件
arr = np.random.randint(0, 10, size = (3, 4))
np.savetxt('arr.csv', arr, delimiter = ',')  # 存储数组到txt文件,文件后缀是txt也是一样的
np.loadtxt('arr.csv', delimiter = ',', dtype = np.int32)  # 读取txt文件, delimiter为分隔符,dtype是数据类型

第二部分 数据类型

ndarray的数据类型:

  • int: int8、uint8、int16、int32、int64 # int8范围: (-127, 127), uint8范围:(0, 256)
  • float:float16、float32、float64
  • str
import numpy as np
np.array([1, 2, 5, 8, 19], dtype = 'float32')  # 输出:array([1., 2., ......19.], dtype = float32)
# asrray 转换时指定
arr = [1, 3, 5, 7, 2, 9, 0]
np.asarray(arr, dtype = 'float32')  # 输出:array([1., 3., 5., .... 0.])
# 数据类型转换
arr = np.random.randint(0, 10, size = 5, dtype = 'int16')  # 输出:array([6, 9, 6, 2, 3], dtype = int16)
arr.astype('float')  # 输出:array([6., 9., 6., 2., 3.])

第三部分 数组运算

3.1.1 加减乘除幂运算
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([2, 3, 1, 5, 9])
arr1 - arr2  # 减法
arr1 * arr2  # 乘法
arr1 / arr2  # 除法   # 对应位置相除
arr1 ** arr2 # 幂运算
3.1.2 逻辑运算
import numpy as np
arr1 = np.array([1,2,3,4,5])
arr2 = np.array([1, 0, 2, 3, 5])
arr1 < 5   # array([ True,  True,  True,  True, False]), 输出boolean(布尔) 值
arr1 == 5
arr1 == arr2
arr1 > arr2
3.1.3 数组和标量运算
import numpy as np
arr = np.arange(1, 10)
1 / arr
arr + 5
arr * 5
3.1.4 *=、+=、-=操作
import numpy as np
arr1 = np.arrange(5)
arr1 += 5
arr1 -= 5
arr1 *= 5

第四部分 复制和视图

完全没复制

import numpy as np
a = np.random.randint(0, 100, size = (4, 5))
b = a
a is b  # 返回True, a和b是两个不同名字对应同一个内存对象
b[0, 0] = 1024  # 命运共同体
display(a, b)

查看或浅拷贝

不同的数组对象可以共享相同的数据,该view方法创建一个查看相同数据的新数组对象

import numpy as np
a = np.random.randint(0, 100, size = (4, 5))
b = a.view()  # 使用a中的数据创建一个新的数据对象
a is b # 返回false, a和b是两个不同名字对应的同一个内存对象
b.base is a # 返回true, b视图的根数据和a一样
b.flags.owndata # 返回false,b中的数据不是自己的
a.flags.owndata # 返回true, a中的数据是自己的 
b[0, 0] = 1024  # a,b数据都发生改变
display(a, b)

深拷贝

import numpy as np
a = np.random.randint(0, 100, size = (4, 5))
b = a.copy()
b is a  # 返回false
b.base is a  # 返回false
b.flags.owndata  # 返回true
a.flags.owndata  # 返回true
b[0, 0] = 1024  # b改变,a不变,分道扬镳
display(a, b)

copy 应该在不在需要原来的数组情况下,切片后调用,例如,假设a是一个巨大的中间结果,而所求结果只是其中一小部分,则在b使用切片进行构造时应制作一个深拷贝:

import numpy as np
a = np.arange(1e8)  # a[-2:]  # 值为array([99999998., 99999999.])
b = a[::1000000].copy()   # 每100万个数据中取一个数据
del a # 不再需要a ,删除占大内存的a
b.shape  # 

第五部分 索引、切片和迭代

第一节 基本索引和切片

arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[5] # 索引 输出5
arr[5: 8]  # 切片输出:array([5, 6, 7])
arr[2:: 2]  # 从索引2开始每两个中取一个, 输出array([2, 4, 6, 8])
arr[:: 3]  # 不写索引默认从0开始, 每3个中取一个  输出 array([0, 3, 6, 9])
arr[1:7:2]  # 从1开始到索引7,左闭右开,每两个数取一个  输出 array([1, 3, 5])
arr[::-1]  # 倒序, 输出 array([9, 8......1, 0])
arr[::-2]  # 倒序, 倒序每两个取一个值 array([9, 7, 5, 3, 1])
arr[5, 8]  # 切片赋值到每个元素
temp = arr[5: 8]
temp[1] = 1024
arr  # 输出:arr([0, 1, 2, 3, 4, 12, 1024, 12, 8, 9])
对于二维或高维数组
arr2d = np.array([[1, 3, 5], [2, 4, 6], [-2, -7, -9], [6, 6, 6]])  # 二维数组,shape(3, 4)
arr2d[0, -1]   # 索引 等于arr2d[0][-1] 输出5
arr2d[0, 2]
arr2d[:2, -2:]  # 切片,同时对一维、二维切片, 结果为二维数组
arr2d[:2, 1:]  # 切片 正序和倒序形式,结果其实一致

花式索引和索引技巧

整数数组进行索引即花式索引,其和切片不一样,它总是将数据复制到新数组中

import numpy as np
#一维
arr1 = np.array([1,2,3,4,5,6,7,8,9,10])
arr2 = arr1[[1,3,3,5,7,7,7]] # 输出 array([2, 4, 4, 6, 8, 8, 8])
arr2[-1] = 1024 # 修改值,不影响arr1

#二维
arr2d = np.array([[1,3,5,7,9],[2,4,6,8,10],[12,18,22,23,37],[123,55,17,88,103]])  #shape(4,5)
arr2d[[1,3]] # 获取第二行和第四行,索引从0开始的所以1对应第二行 
# 输出 array([[  2,   4,   6,   8,  10],
#            [123,  55,  17,  88, 103]])
arr2d[([1,3],[2,4])] # 相当于arr2d[1,2]获取一个元素,arr2d[3,4]获取另一个元素  # 输出为 array([  6, 103])
# 选择一个区域
arr2d[np.ix_([1,3,3,3],[2,4,4])]  # 第一个列表存的是待提取元素的行标,第二个列表存的是待提取元素的列标
#  np.ix_函数就是输入两个数组,产生笛卡尔积的映射关系,得到(1,2),(1,4),(1,4),(3,2)的坐标,再按坐标进行取值
arr2d[[1,3,3,3]][:,[2,4,4]] # 相当于 arr2d[np.ix_([1,3,3,3],[2,4,4])]  结果如下
# array([[  6,  10,  10],
#        [ 17, 103, 103],
#        [ 17, 103, 103],
#        [ 17, 103, 103]])

boolean 值索引

names = np.array(['softpo','Brandon','Will','Michael','Will','Ella','Daniel','softpo','Will','Brandon'])
cond1 = names == 'Will'   # 此时cond1取值 # array([False, False,  True, False,  True, ...   True, False])
names[cond1] # array(['Will', 'Will', 'Will'], dtype='<U7')
arr = np.random.randint(0,100,size = (10,8))  # 0~100随机数
cond2 = arr > 90  # 找到所有大于90的索引,返回boolean类型的数组 shape(10,8),大于返回True,否则False
arr[cond2] # 返回数据全部是大于90的

第六部分 形状操作

数组变形
import numpy as np
arr1 = np.random.randint(0,10,size = (3,4,5))
arr2 = arr1.reshape(12,5) # 形状改变,返回新数组
arr3 = arr1.reshape(-1,5) # 自动“整形”,自动计算
数组转置
import numpy as np
arr1 = np.random.randint(0,10,size = (3,5)) # shape(3,5)
arr1.T # shape(5,3) 转置
arr2 = np.random.randint(0,10,size = (3,6,4)) # shape(3,6,4)
np.transpose(arr2,axes=(2,0,1)) # transpose改变数组维度 shape(4,3,6)
数组堆叠
import numpy as np
arr1 = np.array([[1,2,3]])
arr2 = np.array([[4,5,6]])
np.concatenate([arr1,arr2],axis = 0) # 串联合并shape(2,3) axis = 0表示第一维串联 输出为
# array([[1, 2, 3],
#        [4, 5, 6]])
np.concatenate([arr1,arr2],axis = 1) # shape(1,6) axis = 1表示第二维串联 输出为:array([[1, 2, 3, 4, 5, 6]])
np.hstack((arr1,arr2)) # 水平方向堆叠 输出为:array([[1, 2, 3, 4, 5, 6]])
np.vstack((arr1,arr2)) # 竖直方向堆叠,输出为:
# array([[1, 2, 3],
#        [4, 5, 6]])
split 数组拆分
import numpy as np
arr = np.random.randint(0,10,size = (6,5)) # shape(6,5)
np.split(arr,indices_or_sections=2,axis = 0) # 在第一维(6)平均分成两份 
np.split(arr,indices_or_sections=[2,3],axis = 1) # 在第二维(5)以索引2,3为断点分割成3份,列结果为(2, 1, 2)
np.vsplit(arr,indices_or_sections=3) # 在竖直方向平均分割成3份,不能整除时报错
np.hsplit(arr,indices_or_sections=[1,4]) # 在水平方向,以索引1,4为断点分割成3份

第七部分 广播机制

当两个数组的形状并不相同的时候,我们可以通过扩展数组的方法来实现相加、相减、相乘等操作,这种机制叫做广播(broadcasting)

一维数组广播
import numpy as np
arr1 = np.sort(np.array([0,1,2,3]*3)).reshape(4,3) #shape(4,3)
arr2 = np.array([1,2,3]) # shape(3,)
arr3 = arr1 + arr2 # arr2进行广播复制4份 shape(4,3)
二维数组广播
import numpy as np
# np.sort() 对数组进行排序, 默认axis = 1, (按行排序), axis = 0 时, 按列排序
arr1 = np.sort(np.array([0,1,2,3]*3)).reshape(4,3) # shape(4,3)  
arr2 = np.array([[1],[2],[3],[4]]) # shape(4,1)
arr3 = arr1 + arr2 # arr2 进行广播复制3份 shape(4,3)
三维数组广播
import numpy as np
arr1 = np.array([0,1,2,3,4,5,6,7]*3).reshape(3,4,2) #shape(3,4,2)
arr2 = np.array([0,1,2,3,4,5,6,7]).reshape(4,2) #shape(4,2)
arr3 = arr1 + arr2 # arr2数组在0维上复制3份 shape(3,4,2)

第八部分 通用函数

第一节 通用函数:元素级数字函数

import numpy as np
arr1 = np.array([1,4,8,9,16,25])
np.sqrt(arr1) # 开平方
np.square(arr1) # 平方
np.clip(arr1,2,16) # 输出 array([ 2,  4,  8,  9, 16, 16])  # np.clip :限定最大值及最小值

x = np.array([1,5,2,9,3,6,8])
y = np.array([2,4,3,7,1,9,0])
np.maximum(x,y) # 返回两个数组中的比较大的值
arr2 = np.random.randint(0,10,size = (5,5))
np.inner(arr2[0],arr2) #返回一维数组向量内积

第二节 where函数

import numpy as np
arr1 = np.array([1,3,5,7,9])
arr2 = np.array([2,4,6,8,10])
cond = np.array([True,False,True,True,False])
np.where(cond,arr1,arr2) # True选择arr1,False选择arr2的值
# 输出 array([ 1,  4,  5,  7, 10])

arr3 = np.random.randint(0,30,size = 20)
np.where(arr3 < 15,arr3,-15) # 小于15还是自身的值,大于15设置成-15

第三节 排序方法

import numpy as np
arr = np.array([9,3,11,6,17,5,4,15,1])
arr.sort() # 直接改变原数组
np.sort(arr) # 返回深拷贝排序结果
arr = np.array([9,3,11,6,17,5,4,15,1])
arr.argsort() # 返回从小到大排序索引 array([8, 1, 6, 5, 3, 0, 2, 7, 4])

第四节 集合运算函数

A = np.array([2,4,6,8])
B = np.array([3,4,5,6])
np.intersect1d(A,B) # 交集 array([4, 6])
np.union1d(A,B) # 并集 array([2, 3, 4, 5, 6, 8])
np.setdiff1d(A,B) #差集,A中有,B中没有 array([2, 8])

第五节 数学和统计函数

import numpy as np
arr1 = np.array([1,7,2,19,23,0,88,11,6,11])
arr1.min() # 计算最小值 0
arr1.argmax() # 计算最大值的索引 返回 6
np.argwhere(arr1 > 20) # 返回大于20的元素的索引
np.cumsum(arr1) # 计算累加和
arr2 = np.random.randint(0,10,size = (4,5))
arr2.mean(axis = 0) # 计算列的平均值
arr2.mean(axis = 1) # 计算行的平均值
np.cov(arr2,rowvar=True) # 协方差矩阵
np.corrcoef(arr2,rowvar=True) # 相关性系数

# 常用的函数
import numpy as np  # 导入类库 numpy
data = np.loadtxt('./iris.csv',delimiter = ',')  # 读取数据文件,data是二维的数组
data.sort(axis = -1)  # 简单排序
print('简单排序后:', data)
print('数据去重后:', np.unique(data)) # 去除重复数据
print('数据求和:', np.sum(data))  # 数组求和
print('元素求累加和', np.cumsum(data))  # 元素求累加和
print('数据的均值:', np.mean(data))  # 均值
print('数据的标准差:', np.std(data))  # 标准差
print('数据的方差:', np.var(data))  # 方差
print('数据的最小值:', np.min(data))  # 最小值
print('数据的最大值:', np.max(data))  # 最大值

第九部分 线性代数

矩阵乘积

#矩阵的乘积
A = np.array([[4,2,3],
              [1,3,1]]) # shape(2,3)
B = np.array([[2,7],
              [-5,-7],
              [9,3]]) # shape(3,2)
np.dot(A,B) # 矩阵运算 A的最后一维和B的第一维必须一致, A的列数和B的行数一致
A @ B # 符号 @ 表示矩阵乘积运算

矩阵其他计算

#计算矩阵的逆
from numpy.linalg import inv,det,eig,qr,svd
A = np.array([[1,2,3],
              [2,3,4],
              [4,5,8]]) # shape(3,3)
inv(t) # 逆矩阵
det(t) #计算矩阵行列式
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值