第一部分 基本操作

第一节 数组的创建

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) #计算矩阵行列式

01-NumPy 数据库相关推荐

  1. MySQL学习笔记01【数据库概念、MySQL安装与使用】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  2. 01 MySQL数据库 MySQL入门

    01 MySQL数据库 从今天开始,我们将进入系列课程的 第四模块 的学习,这个模块就是给大家讲解MySQL数据库. 以前,在开发程序时,我们会把很多的数据和信息存储到某个文件夹中的文件中,例如:us ...

  3. 【高级数据库】第一章 第01讲 数据库概述

    [高级数据库]第一章 DBMS系统概述   博主学院最近有关于高级数据库的课程,为了很好的记录高级数据库的相关知识点,开辟了以<数据库系统实现(第二版)>为基础,结合学院课程具体的内容,编 ...

  4. 【SQL数据库基础01】数据库和SQL概述

    文章目录 01 引入 1.1 数据库存储数据的特点 1.2 三个重要概念 1.2.1 DBMS 1.3 SQL的优点: 图例说明: 1.4 SQL语言四大类 1.4.1 数据查询语言DQL 1.4.1 ...

  5. 【宋红康 MySQL数据库】【01】数据库概述

    持续学习&持续更新中- 学习态度:守破离 [宋红康 MySQL数据库][01]数据库概述 1. 为什么要使用数据库 2. 数据库与数据库管理系统 2.1 数据库的相关概念 2.2 数据库与数据 ...

  6. 【学习笔记】山东大学生物信息学-01 生物数据库

    课程地址:山东大学生物信息学 文章目录 一.生物数据库 1.1 PubMed 文献数据库 1.2 一级核酸数据库 1.2.1 INSDC = Genbank + ENA + DDBJ 1.2.2 基因 ...

  7. 01.MySQL数据库初识

    一 数据库概述 1. 数据库??? 什么是数据库呢? 先来看看百度怎么说的 数据库,简而言之可视为电子化的文件柜--存储电子文件的处所,用户可以对文件中的数据运行新增.截取.更新.删除等操作.所谓&q ...

  8. 【高级数据库】第二章 第01讲 数据库索引

    [高级数据库]第二章 数据库索引   在第一章我们主要介绍了数据库的基础知识,包括数据库和数据库管理系统的概念,了解了数据库管理系统是如何执行用户命令的.另外还回顾了数据库有关的基础内容,包括三级模式 ...

  9. python数组求和函数_python数据分析之Numpy数据库第三期数组的运算

    上期数组的索引和切片的知识总结通道:数组的索引和切片 数组和标量间的运算 数组之所以强大而且重要的原因,是其不需要通过循环就可以完成批量计算,也就是矢量化 import numpy as np a = ...

  10. MySQL数据库-笔记01【数据库概念、数据库安装、终端操作数据库】

    学习地址:一天学会 MySQL 数据库      MySQL安装教程      MySQL专栏

最新文章

  1. 如何使用Bootstrap4和ES6创建自定义确认框
  2. C++实现树的建立,查找,遍历输出
  3. 搜索帮助1:在选择屏幕使用自定义搜索帮助
  4. Django查询数据
  5. 【云计算平台】VMware搭建Centos 7虚拟机
  6. Python包管理工具小结
  7. Python 爬取 6000 篇文章分析 CSDN 是如何进入微信 500 强的
  8. vivo面试经验4(linux基本操作,最基本,必须得会!!)
  9. ies4linux 本地安装,Linux下离线安装ies4linux
  10. 脚本框架源码,多线程,完美框架,极限多开,随意游戏可套入,端游手游
  11. vnc远程控制软件官网,vnc远程控制软件官网下载,好物推荐
  12. 基于 Verilog 的经典数字电路设计(10)三态门
  13. java反向查找dns_windows – 反向DNS查找
  14. Typora保存文章到本地并查看源代码的方法(简)
  15. Excel单元格设置下拉选项
  16. 互联网快讯:国家植物园在北京正式揭牌;极米Z6X Pro、极米H3S获赞赏;人民币兑日元逼近20大关
  17. Linux 中的内存使用率计算方式
  18. Don‘t Cry Over Spilt Milk
  19. Java Email Server
  20. opencv 鼠标绘图

热门文章

  1. 2022-10-11(一、远程命令执行和系统命令执行)
  2. win32模态与非模态对话框
  3. 2022出海拉美:秘鲁电商市场现状及发展前景
  4. (5)数据库—----单行函数—------字符函数、数学函数、日期函数
  5. Oracle Linux 迷途知返
  6. EasyNVR接入EasyNVS显示授权超时是什么原因?如何解决?
  7. 幸运转盘中的芯片——CD4017和NE555
  8. Taro-RN使用 react-native-wechat-lib 集成微信支付-IOS(从微信注册应用到应用接入微信支付)全*
  9. Diffusion-LM Improves Controllable Text Generation 扩散语言模型改善可控文本生成
  10. 2014 WOT全球软件技术峰会深圳站