Python科学计算包NumPy教程

2023-05-16

在我的Github上有一份代码与教程结合的jupyter Notebook文件,大家可以clone下来看一看。
下面会用实例的方式给出一些examples:
Tutorial教程
官方中文文档

import numpy as np

# 创建数组:
array1 = np.array([1, 2, 3]) # 创建一个一维数组,只有一个轴,轴的长度为3
print(array1)

# 通过列表创建二维数组:
print(np.array([(1, 2, 3), (4, 5, 6)])) # 2x3的数组

# 创建全为0的二维数组:
print(np.zeros((3, 3))) # 3x3的零矩阵

# 创建全为1的三维矩阵:
print(np.ones((2, 3, 4))) # 2x3x4的元素全为1的矩阵

# 创建一维等差数组:
print(np.arange(10))

# 创建二维等差数组:
print(np.arange(6).reshape(2, 3)) # 创建2x3的等差数组

# 创建单位矩阵(二维数组):
print(np.eye(3))

# 创建间隔一维数组:
print(np.linspace(1, 10, num = 6))

# 创建二维随机数组
print(np.random.rand(2, 3))

# 创建二维随机整数数组(数值小于5)
print(np.random.randint(5, size = (2, 3)))

# 依据自定义函数创建数组(lambda表达式):
print(np.fromfunction(lambda x, y: x + y, (3, 3)))

# 生成一维数组a, b后进行数组运算:
a = np.array([10, 20, 30, 40, 50])
b = np.arange(1, 6)
print(a)
print(b)

# add加法运算:
print(a + b)

# sub减法运算:
print(a - b)

# Multiply乘法运算:
print(a * b)

# divide除法运算:
print(a / b)
print('以上操作均在一维数组上进行')

# 生成二维数组A, B进行数组运算:
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print(A)
print(B)

# add:
print(A + B)

# sub:
print(A - B)

# multiply矩阵元素之间的乘法:
print(A * B)

# 矩阵乘法运算:
print(np.dot(A, B))

# 或者将A, B转为matrix矩阵再直接相乘
print(np.mat(A) * np.mat(B))

# 数乘矩阵:
print(20 * A)

# 矩阵的转置:
print(A.T)

# 矩阵求逆:
print(np.linalg.inv(A))

print('以上操作均在二维数组或矩阵中进行')

# 数学函数
print('Math Function example')
# 三角函数:
print(a)

print(np.sin(a))

# 以自然对数为底的指数函数e^x:
print(np.exp(a))

# 数组的开平方根
print(np.sqrt(a))

# 数组的切片 and 索引
print('Array split & index')

# 一维数组index
a = np.array([1, 2, 3, 4, 5])
print(a[0])
print(a[-3])

# 一维数组split
print(a[0: 2])
print(a[: -1])

# 二维数组index:
a = np.array([(1, 2, 3), (4, 5, 6), (7, 8, 9)])
print(a[0])
print(a[-1])

# 二维数组split:
print(a[:, -1])  # 二维数组切片需要用,区分行列这里是最后一列的意思

# 数组外形操作:
print('Array Shape')

# 查看数组形状:
a = np.random.random((3, 2))
print(a)
print(a.shape)

# 更改数组形状(不改变原始数组的形状):
print(a.reshape(2, 3))
print(a)
# 更改数组形状(改变原始数组的形状)
print(a.resize(2, 3))
print(a)

# 展平数组 将多维数组转换为一维数组
print(a.ravel())

# 垂直合并数组
a = np.random.randint(10, size = (3, 3))
b = np.random.randint(10, size = (3, 3))
print(a)
print(b)

print(np.vstack((a, b)))

# 水平合并数组:
print(np.hstack((a, b)))

# 沿x轴切分数组:
print(np.vsplit(a, 3)) # 将a切分成三个行向量(一维数组)

# 沿y轴切分数组:
print(np.hsplit(a, 3)) # 将a切分成三个列向量(一维数组)

# 数组排序
a = np.array(([1, 4, 3], [6, 2, 0], [9, 7, 5]))
print(a)

# 返回数组每一列的最大值:
print(np.max(a, axis = 0))

# 返回数组每一行的最小值:
print(np.min(a, axis = 1))

# 返回数组每一列最大元素的index:
print(np.argmax(a, axis = 0))

# 返回数组每一行最小元素的index:
print(np.argmin(a, axis = 1))

# Array Count
print('Array Count')

# 统计数组每一列的中位数
print(np.median(a, axis = 0))

# 统计数组各行的sqrt
print(np.mean(a, axis = 1))

# 统计数组每一列的average:
print(np.average(a, axis = 0))

# 统计数组各行的方差:
print(np.var(a, axis = 1))

# 统计数组每一列的标准偏差:
print(np.std(a, axis = 0))

# 创建一个6x6的二维数组,边界值全为1,Other Value is 0:
Z = np.ones((6, 6))
Z[1: -1, 1: -1] = 0
print(Z)

# 使用数字0将一个全为1的6x6的二维数组包围
Z = np.ones((6, 6))
Z = np.pad(Z, pad_width = 1, mode = 'constant', constant_values = 0)
'''
Examples
    --------
    >>> x = np.arange(9).reshape((3,3))
    >>> x
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])

    >>> np.diag(x)
    array([0, 4, 8])
    >>> np.diag(x, k=1)
    array([1, 5])
    >>> np.diag(x, k=-1)
    array([3, 7])

    >>> np.diag(np.diag(x))
    array([[0, 0, 0],
           [0, 4, 0],
           [0, 0, 8]])

'''
# 创建一个6x6的二维数组,并设置1,2,3,4,5落在对角线下方:
Z = np.diag(1 + np.arange(5), k = -1) # k = 1主对角线 k = -1副对角线
print(Z)

# 创建一个10x10的二维数组,并使得1和0沿对角线间隔放置:
Z = np.zeros((10, 10), dtype = int)
Z[1::2, ::2] = 1
Z[::2, 1::2] = 1
print(Z)

# 创建一个0 - 10的一个一维数组, 并将(1, 9]之间的全部数值转换成负数
Z = np.arange(11)
print(Z)
Z[(1 < Z) & (Z <= 9)] *= -1
print(Z)

# 找出两个一维数组中相同的元素:
Z1 = np.random.randint(0, 10, 10)
Z2 = np.random.randint(0, 10, 10)
print("Z1:", Z1)
print("Z2:", Z2)
print(np.intersect1d(Z1, Z2)) # 找出Z1和Z2中的相同元素

# 使用NumPy打印yesterday, today, tomorrow
yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D')
today = np.datetime64('today', 'D')
tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D')
print("yesterday: ", yesterday)
print("today: ", today)
print("tomorrow: ", tomorrow)

# 使用五种不同的方法提取一个随机数组的整数部分
Z = np.random.uniform(0, 10, 10)
print('init:', Z)
print('way 1:', Z - Z % 1)
print('way 2:', np.floor(Z))
print('way 3:', np.ceil(Z) - 1)
print('Way 4:', Z.astype(int))
print('Way 5:', np.trunc(Z))

# 创建一个5x5的矩阵,其中每行的数值范围从1~5:
Z = np.zeros((5, 5))
Z += np.arange(1, 6)
print(Z)

# 创建一个长度为5的等间隔一维数组,其值域(0,1):
# linspace的功能是返回指定区域间隔的数组,endpoint = True说明右半区间是闭合边界可以取到
Z = np.linspace(0, 1, 6, endpoint = False)[1:]
print(Z)

# 创建一个长度为10的一维数组,并将其按升序排序:
Z = np.random.random(10)
Z.sort()
print(Z)

# 创建一个4x4的二维数组,并按照列进行升序排序
Z = np.array([[7, 4, 3], [3, 1, 2], [4, 2, 6]])
print("original array:\n", Z)
Z.sort(axis = 0)
print(Z)

# 创建一个长度为5的一维数组,并将其中最大值替换为0
Z = np.random.random(5)
print('Original Array:\n', Z)
Z[Z.argmax()] = 0
print(Z)

# 打印每个NumPy标量类型的min and max:
for dtype in [np.int8, np.int32, np.int64]:
    print("The minimum value of {}: ".format(dtype), np.iinfo(dtype).min)
    print("The maximum value of {}: ".format(dtype), np.iinfo(dtype).max)
for dtype in [np.float32, np.float64]:
    print("The minimum value of {}: ".format(dtype), np.finfo(dtype).min)
    print("The maximum value of {}: ".format(dtype), np.finfo(dtype).max)

# 将float32转换为整型:
Z = np.arange(10, dtype = np.float32)
print(Z)

Z = Z.astype(np.int32, copy = False) # copy = False:返回输入数组的副本,否则创建一个新的数组返回
print(Z)

# 将随机二维数组按照第3列从上到下进行升序排序:
Z = np.random.randint(0, 10, (5, 5)) # 返回5x5的二维数组,里面的元素为0~9
print("排序前:\n", Z)
print(Z[Z[:, 2].argsort()]) # 因为按照第三列排序,排序移动的是每一个行向量

# 从随机一维数组中找出距离给定数值(0.5)最近的数:
Z = np.random.uniform(0, 1, 20)
print('random array:\n', Z)
z = 0.5
m = Z.flat[np.abs(Z - z).argmin()]
print(m)

# 将二维数组的前两行进行顺序交换
Z = np.arange(25).reshape(5, 5)
print(Z)
Z[[0, 1]] = Z[[1, 0]]
print(Z)

# 找出随机一维数组中出现频率最高的值
Z = np.random.randint(0, 10, 50)
print('random array:', Z)
print(np.bincount(Z).argmax())

# 找出给定一维数组中非0元素的index:
Z = np.nonzero([1, 1, 1, 1, 0, 0, -1, 0])
print(Z)

# 给定5x5的二维数组,在其内部随机放置p个值为1的数:
p = 3
Z = np.zeros((5, 5))
np.put(Z, np.random.choice(range(5 * 5), p, replace = False), 1)
print(Z)

# 随机的3x3二维数组,减去数组每一行的average:
X = np.random.rand(3, 3)
print(X)

Y = X - X.mean(axis = 1, keepdims = True)
print(Y)

# 获得二维数组点积结果的对角线数组:
X = np.random.uniform(0, 1, (3, 3))
Y = np.random.uniform(0, 1, (3, 3))
print(np.dot(X, Y))
print('speed lower:')
# speed low way:
print(np.diag(np.dot(X, Y)))
# speed quicker way:
print('speed quicker:')
print(np.einsum("ij, ji->i", X, Y))

# 找到随机一维数组前p个最大值
Z = np.random.randint(1, 100, 100)
print(Z)

p = 5
print(Z[np.argsort(Z)[-p: ]])

# 将二维数组中所有元素保留两位小数:
Z = np.random.random((5, 5))
print(Z)

np.set_printoptions(precision = 2)
print(Z)

# 使用科学计数法输出数组:
Z = np.random.random([5, 5])
print(Z)
print(Z / 1e3)

# 使用NumPy找出百分位数:
a = np.arange(15)
print(a)

print(np.percentile(a, q = [25, 50, 75]))

# 找出数组中缺失值的总数以及所在的位置
Z = np.random.rand(10, 10)
print("Z:\n", Z)
Z[np.random.randint(10, size = 5), np.random.randint(10, size = 5)] = np.nan
print(Z)

# 从随机数组中删除包含缺失值的行:
print(np.sum(np.isnan(Z), axis = 1) == 0)

# 统计随机数组中的各元素的数量:
Z = np.random.randint(0, 100, 25).reshape(5, 5)
print(Z)
print(np.unique(Z, return_counts = True))

# 将数组中各元素按指定分类转换为文本值
Z = np.random.randint(1, 4, 10)
print(Z)

label_map = {1: 'car', 2: 'bus', 3:'train'}
print([label_map[x] for x in Z])

# 打印各元素在数组中升序排列的index:
Z = np.random.randint(100, size = 10)
print('Array:', Z)
print(Z.argsort())

# 得到二维随机数组各行的最大值max:
Z = np.random.randint(1, 100, [5, 5])
print(Z)
print(np.amax(Z, axis = 1))

# 得到二维随机数组各行的最小值min:
Z = np.random.randint(1, 100, [5, 5])
print(Z)
print(np.apply_along_axis(np.min, arr = Z, axis = 1))

# 计算两个数组之间的欧氏距离:
X = np.array([1, 2])
Y = np.array([5, 6])
print(np.sqrt(np.power((6 - 2), 2) + np.power((5 - 1), 2)))
print(np.linalg.norm(Y - X)) # NumPy中的计算

# 打印复数的实部和虚部
a = np.array([1 + 2j, 3 + 4j, 5 + 6j])
print('real:', a.real)
print('imag:', a.imag)

# 求解给出矩阵的逆矩阵并验证:
matrix = np.array([[1., 2.], [3., 4.]])
inverse_matrix = np.linalg.inv(matrix)

# 验证原矩阵和逆矩阵想乘是否为单位矩阵E
assert np.allclose(np.dot(matrix, inverse_matrix), np.eye(2))
print(inverse_matrix)

# 使用Z-Score标准化算法对数据进行标准化处理Z = (X - mean(X)) / sd(X)
def zscore(x, axis = None):
    xmean = x.mean(axis, keepdims = True)
    xstd = np.std(x, axis = axis, keepdims = True)
    zscore = (x - xmean) / xstd
    return zscore
Z = np.random.randint(10, size = (5, 5))
print(Z)
print('Z-Score\n')
print(zscore(Z))

# 使用Min-Max标准化算法对数据进行标准化处理:Y = (Z - min(Z)) / max(Z) - min(Z)
def min_max(x, axis = None):
    min = X.min(axis = axis, keepdims = True)
    max = X.max(axis = axis, keepdims = True)
    result = (x - min) / (max - min)
    return result

Z = np.random.randint(10, size = (5, 5))
print('original Z\n')
print(Z)
print(min_max(Z))

# 使用L2范数对数据进行标准化处理L2 = sqrt(pow(x1, 2) + pow(x2, 2) + ....pow(xn,2))
def l2_normalize(v, axis = 1, order = 2):
    l2 = np.linalg.norm(v, ord = order, axis = axis, keepdims = True)
    l2[l2 == 0] = 1
    return v / 12
z = np.random.randint(10, size = (5, 5))
print(z)
print(l2_normalize(z))

# 使用NumPy计算变量直接的相关性系数:
Z = np.array([
    [1, 2, 1, 9, 10, 3, 2, 6, 7], # 特征A
    [2, 1, 8, 3, 7, 5, 10, 7, 2], # 特征B
    [2, 1, 1, 8, 9, 4, 3, 5, 7] # 特征C
])
'''
相关性系数取值从  [−1,1]  变换,靠近  1  则代表正相关性较强, −1  
则代表负相关性较强。
结果如下所示,变量 A 与变量 A 直接的相关性系数为 1,因为是同一个变量。
变量 A 与变量 C 之间的相关性系数为 0.97,说明相关性较强。
'''
print(np.corrcoef(Z))

# 使用NumPy计算矩阵的特征值和特征向量
M = np.matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
w, v = np.linalg.eig(M)
print(w)
print(v)
# 验证
print(v * np.diag(w) * np.linalg.inv(v))

print('===========')
# 使用NumPy计算Ndarray两相邻元素差值:
z = np.random.randint(1, 10, 10)
print(Z)

print(np.diff(Z, n = 1))
print(np.diff(Z, n = 2))
print(np.diff(Z, n = 3))

print('add===============')
# NumPy将Ndarray相邻元素依次累加
Z = np.random.randint(1, 10, 10)
print(Z)
print(np.cumsum(Z))

# 使用NumPy按列连接两个数组:
m1 = np.array([1, 2, 3])
m2 = np.array([4, 5, 6])
print(np.c_[m1, m2])

# 使用NumPy按行连接两个数组:
m1 = np.array([1, 2, 3])
m2 = np.array([4, 5, 6])
print(np.r_[m1, m2])

# 使用NumPy打印9*9乘法表
print(np.fromfunction(lambda x, y: (x + 1) * (y + 1), (9, 9)))

print('image =============')
# 使用NumPy将图片转为Ndarray数组:
from io import BytesIO
from PIL import Image
import pylab
import PIL
import requests

# 通过链接下载图像
URL = 'https://i.loli.net/2020/07/16/9H6Kwo8vifTVS7O.jpg'
response = requests.get(URL)

# 将内容读取为图像
I = Image.open(BytesIO(response.content))
# 将图像转换为 Ndarray
picture = np.asarray(I)
print(picture)

# 将转换后的 Ndarray 重新绘制成图像
from matplotlib import pyplot as plt

plt.imshow(picture)
pylab.show()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python科学计算包NumPy教程 的相关文章

随机推荐

  • 如何在官网下载COCO数据集

    官网地址 xff1a https cocodataset org download 1 选择下载的数据 xff0c 右键 xff0c 获取下载地址 2 将 http 改为 https 示例获得的下载地址为 xff1a http images
  • 两个互相引用对象的垃圾回收

    部分转自 xff1a 深入理解java虚拟机 一书 判断对象是否存活 1 引用计数算法 给对象添加一个引用计数器 xff0c 每当有一个地方引用它时 xff0c 计数器值就加1 当引用失效时 xff0c 计数器值就减1 任何时刻计数器为0的
  • ssm整合时,通过jdbc.properties文件无法连接mysql问题

    最近在重温ssm框架 在搭建基础的项目进行单元测试时 xff0c 发现无法连接mysql数据库 通过各种查资料终于发现了原因 原始jdbc properties文件 由于username这个属性会被系统的username变量覆盖 xff0c
  • Mysql数据库之左连接left join 右连接right join 内连接inner join

    最近 xff0c 公司的用户达到了700 43 万 xff0c 意味着数据库已经达到700 43 万 xff0c 聊聊傻傻分不清的连接查询吧 xff01 前提 数据库中一共有三个表 class book phone 而且每个数据库表中都有1
  • VMware虚拟机软件,配置Linux Ubuntu操作系统环境,及安装问题总结大全

    文章目录 1 xff1a 前言2 xff1a 基本认识3 下载环境4 xff1a VM虚拟机的安装5 xff1a ubuntu的下载6 xff1a 把ubuntu安装在VM虚拟机上7 VMware Tools工具8 Source insig
  • linux常用命令(Beginner note)

    命令 ls 列出所有文件及文件夹 ls 路径 xff1a 列出所给路径下的所有文件及文件夹 选项 xff1a xff08 可组合使用 xff0c 也可简写组合形式 xff0c 例 xff1a alh xff0c 无先后顺序 xff09 a
  • 利用JS-SDK微信分享接口调用(后端.NET)

    一直都想研究一下JS SDK微信分享的接口调用 xff0c 由于最近工作需要 xff0c 研究了一下 xff0c 目前只是实现了部分接口的调用 xff1b 其他接口调用也是类似的 xff1b 在开发之前 xff0c 需要提前准备一个微信公众
  • Linux文件查找find

    1 find查找概述 为什么要有文件查找 xff0c 因为很多时候我们可能会忘了某个文件所在的位置 xff0c 此时就需要通过find来查找 find命令可以根据不同的条件来进行查找文件 xff0c 例如 xff1a 文件名称 文件大小 文
  • Linux文件打包与压缩

    1 文件打包与压缩 1 什么是文件压缩 将多个文件或目录合并成为一个特殊的文件 比如 搬家 脑补画面 img 2 为什么要对文件进行压缩 xff1f 当我们在传输大量的文件时 xff0c 通常都会选择将该文件进行压缩 xff0c 然后在进行
  • 集中式版本管理SVN与分布式版本管理Git的区别

    集中式版本控制系统SVN CVS 先说集中式版本控制系统 xff0c 版本库是集中存放在中央服务器的 xff0c 而大家工作的时候 xff0c 用的都是自己的电脑 xff0c 所以要先从中央服务器取得最新的版本 xff0c 然后开始工作 x
  • chatgpt Linux 定时任务 清理rancher pod启动服务的日志文件 脚本

    Linux 定时任务执行命令 假设我们想要每隔X分钟 每隔X天 每天X点执行一个脚本文件 xff0c 可以使用 Linux 自带的 cron 工具来创建定时任务 清理步骤 您可以使用 Linux 自带的 cron 工具来创建定时任务 xff
  • Http协议的几种常见状态码

    在开发好了网站后 xff0c 用户通过URL对资源进行操作 xff0c 服务器端要告诉用户交互的结果 xff0c 比如新增资源是成功还是失败了 一个较好的办法就是遵循HTTP协议 xff0c 使用请求响应的HTTP状态码 xff08 Sta
  • 推荐画UML图以及流程图的在线网站Site

    记得当年学UML课程的时候 xff0c 当你还在为了安装Rose而发愁的时候 xff0c 人家都把作业给交了 xff0c 并且现在大多数UML课程都会让学生使用Rational Rose做画图练习 近来 xff0c 做毕业设计需要提供各种流
  • 浙大PTA平台上的题目题解

    记载一些题目的代码 xff0c 之后想要在b站讲题目 xff0c 到时候会把录的视频上传b站 不是大佬 xff0c 是蒟蒻 xff0c 大佬勿喷 xff0c 仅供参考 xff0c 欢迎大家star xff0c qwq 浙大版 C语言程序设计
  • git 入门教程

    想要将一个项目托管到github xff0c 需要进入项目所在文件夹进行git init命令初始化 Git提交代码的基本流程 xff1a 创建或修改 本地文件使用 git add 命令 xff0c 将创建或修改的文件添加到本地的暂存区 xf
  • 博客搬家

    谢谢大家对我的blog的支持 现在本科毕业 xff0c 准备读研 方向大概是机器学习这一块 又是一个新的开始 我想将我读研学习Python以及机器学习 深度学习 以及数据分析处理 大数据等学习教程放在新的blog上 xff1a blog 欢
  • Python多线程笔记(Python_MultiThread)

    4 MultiThreading 多线程 使用 xff1a a 什么是多线程 xff1f 简单明了 xff0c 让计算机在同一时间内同时运行多个程序 xff0c 并且每个程序的计算互不干扰 xff0c 我们称这样的操作为多线程运算 b ad
  • Python多进程笔记(Python_MultiProcess)

    1 MutiProcessing 多进程 使用 xff1a a 什么是多进程 xff1f 在上面我们使用多线程去分别处理不同的事情 xff0c 看起来 xff0c 多线程处理并不比单线程循环处理的效率看起来那么的高 多进程是在利用我们电脑C
  • Python自带的GUI(Tkinter)教程

    1 Python Tkinter xff08 GUI图形界面 xff09 xff1a a What s Tkinter Tkinter 是什么 xff1f Tkinter是Python自带的一个GUI库 xff0c 他可以将我们在comma
  • Python科学计算包NumPy教程

    在我的Github上有一份代码与教程结合的jupyter Notebook文件 xff0c 大家可以clone下来看一看 下面会用实例的方式给出一些examples xff1a Tutorial教程 官方中文文档 span class to