【科学计算与可视化】1. Numpy 基础

安装方式
pip install numpy 指定版本安装pip install numpy==1.14.1

官方文档:https://numpy.org/doc/stable/reference/index.html

主要介绍 Numpy 的常见基础使用,进阶使用请参考上述官方文档

Numpy 是Python 的一个科学计算基础库,提供大量科学计算相关的功能,比如数据统计,随机数生成等。提供最核心的类型是多维数组类型(ndarray),支持大量的维度数组与矩阵运算,Numpy 支持向量处理 ndarry 对象,提高程序运算速度。

1 数组的创建

numpy.array(data, ndmin, dtype):ndmin 用来指定建立几维的数组,dtype用于指定元素的类型

a = [1,2,3,4,5] # 一维 list
b = [[1,2,3,], [4,5,6]] # 二维 list

import numpy as np
one_dim_array = np.array(a)
two_dim_array = np.array(b)
print(one_dim_array)
print(two_dim_array)


a = np.array([[1,2,3]], ndmin=3)  # ndmin用来指定建立几维的数组
print(a)  #  [[[1 2 3]]]
print(a.shape)   # a.shape 用于查看 ndarray 的形状  x * x * x ...

a = np.array([1,2,3], dtype=float) # dtype用于指定元素的类型
print(a)  # [1. 2. 3.]

numpy.arange(start, stop, step, dtype):类似于range()函数,创建[start, stop)左开右闭步长为 step 的数组,步长默认为 1,dtype 用于指定元素类型

a = np.arange(0, 10, 2, dtype=float)
print(a)

随机数创建,numpy.random
random中常用的方法:

函数描述
seed确定随机生成器的种子
permutation返回一个序列的随机排列或返回一个随机排列的范围
shuffle对一个序列就地随机排列
rand产生均匀分布的样本值
randint三个参数 low, high, size;[low, high),同 range函数,size 是指生成多少个数
random(size)返回 [0.0, 1.0)范围的随机数
randn(d1, d2, d3)返回一个或一组样本,具有正态分布(期望为 0,方差维 1)
a = list(range(10))
print(np.random.permutation(a))  # 有返回值  不会修改 a
print(a)
np.random.shuffle(a) # 没有返回值  会修改 a
print(a)

a = np.random.rand(2, 3)   # rand 中的参数可以接收任意数量的整数参数,用于确定用于生成何种形状的 ndarray   元素的值为 [0,1)
print(a.shape)  # 2 * 3
a = np.random.rand(2, 3, 4)
print(a.shape) # 2 * 3 * 4
a = np.random.uniform(0, 10, (3, 2))  # np.random.uniform  也是均匀分布  可以指定生成的值范围
print(a)


a = np.random.random(size = 10)
print(a)
a = np.random.random(size = (2,3))
print(a)

a = np.random.randn(2, 3)   # randn 中的参数可以接收任意数量的整数参数,用于确定用于生成何种形状的 ndarry
print(a.shape)  # 2 * 3
a = np.random.randn(2, 3, 4)
print(a.shape) # 2 * 3 * 4
a = np.random.normal(loc=2, scale= 1, size = (3, 2))  # np.random.normal  也是正态分布, 可以指定正态分布的方差和期望大小
a = np.random.normal(2, 1, (3, 2)) 
print(a)

np.random.seed(42)
np.random.randn()  # 由于种子是固定的  这里随机出来的值会是一样的   但是不加 seed  单独执行这个代码值会不一样

numpy.zeros(shape, dtype):创建全为 0 的 ndarray
numpy.ones(shape, dtype):创建全为 1 的 ndarray
numpy.empty(shape, dtype):创建未初始化元素值的 ndarray,元素值为内存中默认的值
numpy.linspace(start, stop, num=50, endpoint = True, retstep = False, dtype = None):创建一个等差数列构成的 ndarray; start 序列起始值;stop 序列结束值;num 要生成的样本数;endpoint 是否包含 stop 值;retstep 生成的数组中是否显示间距,显示间距将返回 (ndarray, step)的元组;
numpy.logspace(start, stop, num=50, endpoint = True, base = 10.0, dtype = None):创建一个等比数列构成的 ndarray; start 序列起始值,为base ** start;stop 序列结束值,为base ** stop;num 要生成的样本数;endpoint 是否包含 stop 值;base 对log的底数,默认为 10;

np.zeros((2,3), dtype=float)
np.ones((2,3), dtype=float)
np.empty((2,3), dtype=float)

a = np.arange(12).reshape(3,4)  # reshape 重新调整 ndarray 维度
np.zeros_like(a)  # 和a一样 shape 的 元素为 0 的 ndarray  以下以此类推
np.ones_like(a)
np.empty_like(a)

np.linspace(0, 10, num=50, endpoint = True, retstep = False, dtype = None)
np.logspace(0, 2, num=2, endpoint = True, base = 10, dtype = float)

2 ndarray 对象

ndarray:一系列同类型数据的集合,以 0 下标为开始进行集合元素的索引。

  1. ndarray对象用于存放同类型元素的多维数组
  2. ndarray中的每个元素在内存中都有相同存储大小的区域
  3. 组成
    1. 一个指向数据的指针
    2. 数据类型或 dtype,描述在数组中的固定大小值的格子
    3. 一个表示数组形状的元组,表示各维度大小的元组

2.1 常见属性

属性说明
ndim维度的数量
shape形状,数组的维度
size数组元素的个数, shape为(m,n)的 size 为 m * n
dtype对象的元素类型
itemsize对象中每个元素的大小,以字节为单位
flags内存信息
a = np.random.random((2,3))
print(a.ndim)
print(a.shape)
print(a.size)
print(a.dtype)
print(a.itemsize)
print(a.flags)
'''
2
(2, 3)
6
float64
8
  C_CONTIGUOUS : True
  F_CONTIGUOUS : False
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  WRITEBACKIFCOPY : False
'''

2.2 切片和索引

类似于 python 中 list 的切片特性

x = np.arange(10)
print(x[:2])
print(x[2:5])

# 二维 
x = np.arange(0, 12).reshape(3, 4)
print([1:3, 0:2])

sub_array = np.copy(x[:2, :2])
sub_array[0][0] = 10
print(sub_array)
print(x) # x 数据不会被修改
temp = x[:2, :2]
temp[0][0] = 10
print(x)  # x 数据会被修改

2.3 数组维度改变

reshape:重组原有数组
np.vstacknp.hstacknp.concatenate:数组的拼接
np.hsplitnp.vsplitnp.split:数组的切分

np.vstacknp.hstack 可以用于高维数组,并且它们分别沿第一个和第二个维度进行拼接。如果需要沿其他维度拼接,可以使用 np.concatenate 函数,并指定 axis 参数。

np.split 可以沿任何轴切分数组。你需要提供要切分的位置和轴参数。np.hsplit 用于沿水平轴(第 1 轴)切分数组,主要用于二维及以上维度的数组。np.vsplit 用于沿垂直轴(第 0 轴)切分数组,主要用于二维及以上维度的数组。

x = np.arange(0, 12)
print(x.shape)
x = x.reshape(3, 4)
print(x.shape)

a = np.array([[1,2], [3,4]])  # 2, 2
b = np.array([[5,6]])   # 1, 2
print(np.vstack((a, b)))  # 垂直拼接
print(np.hstack((a, b.T)))  # 水平拼接

# 三维 数组拼接
# 创建三个 3 维数组  (2, 2, 3)
arr1 = np.array([[[1, 2, 3], [4, 5, 6]], 
                 [[7, 8, 9], [10, 11, 12]]])
arr2 = np.array([[[13, 14, 15], [16, 17, 18]], 
                 [[19, 20, 21], [22, 23, 24]]])
arr3 = np.array([[[25, 26, 27], [28, 29, 30]], 
                 [[31, 32, 33], [34, 35, 36]]])

# 沿着轴0拼接
concat_axis0 = np.concatenate((arr1, arr2, arr3), axis=0)
print("\n沿轴0拼接结果:\n", concat_axis0)   # (6, 2, 3)

# 沿着轴1拼接
concat_axis1 = np.concatenate((arr1, arr2, arr3), axis=1)
print("\n沿轴1拼接结果:\n", concat_axis1)  # (2, 6, 3)

# 沿着轴2拼接
concat_axis2 = np.concatenate((arr1, arr2, arr3), axis=2)
print("\n沿轴2拼接结果:\n", concat_axis2) # (2, 2, 9)

2.4 转置操作

二维数组的转置 就是 矩阵的转置运算

arr = np.array([[1, 2, 3], [4, 5, 6]])
print("原数组:\n", arr)
transposed_arr = arr.T
print("转置后的数组:\n", transposed_arr)

# 创建一个三维数组
arr = np.arange(24).reshape(2, 3, 4)
print("原数组:\n", arr)

# 默认转置,交换所有维度
transposed_arr = arr.transpose()
print("\n默认转置 (交换所有维度):\n", transposed_arr)

# 指定轴顺序进行转置 (这里我们交换第一个和第二个轴)
transposed_arr_012 = arr.transpose(1, 0, 2)
print("\n指定轴顺序 (1, 0, 2) 的转置:\n", transposed_arr_012)

# 使用 ndarray.T 进行转置 (默认交换所有维度)
transposed_arr_T = arr.T
print("\n使用 ndarray.T 进行转置:\n", transposed_arr_T)

2.5 算术运算

算术运算需要保证 操作的两个 ndarray 维度需要尽量保持一致;但是当维度不一致的时候,可能也可以进行运算,因为numpy存在广播机制

广播机制

  • 如果数组的维度数不相同,则在较小的数组的形状前面加上 1,直到所有数组具有相同的维度数。
  • 两个数组在某个维度上的长度是相同的,或者其中一个数组在该维度上的长度是 1。
  • 如果以上条件都不满足,则引发异常。
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print("加法:", arr1 + arr2)
print("减法:", arr1 - arr2)
print("乘法:", arr1 * arr2)
print("除法:", arr1 / arr2)

# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
# 标量与数组的加法运算
result = arr + 1
print("标量与数组的加法运算:\n", result)

# 创建一个二维数组
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
# 创建一个一维数组
arr1d = np.array([10, 20, 30])
# 一维数组与二维数组的加法运算
result = arr2d + arr1d
print("一维数组与二维数组的加法运算:\n", result)

# 创建两个形状不同的二维数组
arr2d_1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2d_2 = np.array([[10], [20]])
# 不同形状的二维数组加法运算
result = arr2d_1 + arr2d_2
print("不同形状的二维数组加法运算:\n", result)

以下不符合广播规则,因为 数组在第一个维度上的长度分别为 4 和 3,没有一个长度为 1,因此它们无法广播成相同的形状。

arr1 = np.array([1, 2, 3, 6])
arr2 = np.array([4, 5, 6])
print("加法:", arr1 + arr2)

2.6 向上向下取整与聚合操作

单维度 数组的操作

arr = np.array([1.2, 2.5, 3.7, 4.4])
print("向下取整:", np.floor(arr))
print("向上取整:", np.ceil(arr))

arr = np.array([1, 2, 3, 4, 5])
print("数组之和:", np.sum(arr))
print("数组的平均值:", np.mean(arr))
print("数组的标准差:", np.std(arr))
print("数组的最大值:", np.max(arr))
print("数组的最小值:", np.min(arr))

二维及以上维度的数组 操作

# 创建一个二维数组
arr2d = np.array([[1, 2, 3], [4, 5, 6]])

# 求和
sum_all = np.sum(arr2d)
sum_axis0 = np.sum(arr2d, axis=0) # [5 7 9]
sum_axis1 = np.sum(arr2d, axis=1) # [ 6 15]

# 平均值
mean_all = np.mean(arr2d)
mean_axis0 = np.mean(arr2d, axis=0) # [2.5 3.5 4.5]
mean_axis1 = np.mean(arr2d, axis=1) # 2. 5.]

# 最大值
max_all = np.max(arr2d)
max_axis0 = np.max(arr2d, axis=0) # [4 5 6]
max_axis1 = np.max(arr2d, axis=1) # [3 6]

# 最小值
min_all = np.min(arr2d)
min_axis0 = np.min(arr2d, axis=0) # [1 2 3]
min_axis1 = np.min(arr2d, axis=1) # [1 4]

# 创建一个三维数组
arr3d = np.arange(24).reshape(2, 3, 4)

# 求和
sum_all = np.sum(arr3d)
sum_axis0 = np.sum(arr3d, axis=0)
'''
[[12 14 16 18]
 [20 22 24 26]
 [28 30 32 34]]
'''
sum_axis1 = np.sum(arr3d, axis=1)
'''
[[12 15 18 21]
 [48 51 54 57]]
'''
sum_axis2 = np.sum(arr3d, axis=2)
'''
[[ 6 22 38]
 [54 70 86]]
'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/714330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】Python实现解压rar文件

Python实现解压rar文件 零、需求 最近在开发一个填分数的应用,需要用到selenium,那么自然需要用到浏览器,浏览器内置到应用中,但是上传到GitCode的时候被限制了,单个文件大小只能是10M以内。所以只能压缩&#xff0c…

免费个人站 独立站 wordpress 自建网站

制作免费网站 | 免费网站构建器 | WordPress.com https://bioinformatics7.wordpress.com WordPress.com

运算符分为哪几类?哪些运算符常用作判断?简述运算符的优先级

运算符包含6大类:算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、三元(目)运算符。 逻辑运算符常用作布尔判断 typeof 运算符: typeof 运算符用于确定变量或表达式的数据类型,并返回一个表示类型的字符串。 typeof …

力扣 SQL题目

185.部门工资前三高的所有员工 公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。 编写解决方案,找出每个部门中 收入高的员工 。 以 任意顺序 返回结果表。 返回结果格式如下所示。 …

MFC工控项目实例之四在调试目录下创建指定文件夹

承接专栏《MFC工控项目实例之三theApp变量传递对话框参数》 在调试目录Debug下创建DATA、LIB、TEMP三个文件夹 1、SEAL_PRESSURE.h中添加代码 class CSeatApp : public CWinApp { ... public:CString m_Path;CString m_DataPath,m_TempPath,m_LibPath; ... };2、SEAL_PRESSURE…

leetcode 130被围绕的区域

思路 一个区域不能被围绕是这个区域有部分在边界 可以循环边界,找边界的区域(利用深搜),这些都不能被围绕,其余的,能被围绕,应该从"O"变为”X“ 代码 static boolean[][] hasGo;/…

sigmoid函数

σ ( x ) 1 1 e − x \sigma(x)\frac1{1e^{-x}} σ(x)1e−x1​ sigmoid函数好处 1. σ ( x ) \sigma(x) σ(x)的域值是[0,1] ,在(-∞, ∞)单调递增,很符合概率分布函数的特点 2.以 σ ( x ) \sigma(x) σ(x)为分布函数的概率密度函数在远离零点的位置…

微服务架构思考

时间:2024年06月16日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 音频地址: https://xima.tv/1_HvQZkj?_sonic0https://xima.tv/1_HvQZkj?_sonic0 大家好,欢迎来到小蒋聊技术&#xff0c…

10.Docker Compose容器编排

文章目录 Compose简介安装和卸载步骤核心概念compose文件两要素 使用步骤Compose常用命令微服务测试本地编码打包编写Dockerfile文件构建镜像 不使用Compose调试使用Compose调试WordPress测试验证增量更新 Compose简介 ​ docker建议我们每一个容器中只运行一个服务,因为docke…

CloudFlare 里如何设置参数传递的 301 重定向

自从接到【哈哈,笑死我了都,黔驴技穷了都!】一文里提到的代维客户订单,这两天明月就一直在加班加点的重新部署着客户的四个服务器,因为有三个都是 WordPress+WooCommerce 式的电商平台,很是有些费时费力,好在现在基本都搞定了,剩下的就是些细节方面的优化、调整了。期间…

2024 年最新 Python 使用 gewe 框架搭建微信机器人实现语音智能回复(详细教程)

Gewe 个微框架 GeWe(个微框架)是一个创新性的软件开发框架,专注于IPAD协议,为个人微信号以及企业信息安全提供了强大的功能和保障。GeWe的设计旨在简化开发过程,使开发者能够高效、灵活地构建和定制通信协议&#xff…

uniapp实现路由拦截——实战案例(二)

uniapp如何实现登录路由拦截? 今天再次介绍一下 uni-simple-router 插件,记得最初使用时,是在三年以前了,这里简单介绍通过自动读取 pages.json 作为路由表的方式,欢迎指教~ 文章目录 uniapp如何实现登录路由拦截&…

哪些数据管理知识领域需要做到数据全生命周期管理

一、数据生命周期 数据管理、数据治理、数据安全、元数据管理、数据治理等知识领域,都需要按照数据的生命周期开展管理工作。数据生命周期包括计划、设计/启用、创建/获取、存储/维护、使用、增强和处置。详见下图。 1.数据治理生命周期 1)规划:将数据要求与业务战略连接起…

关于小程序测试账号如何移除

关于小程序测试账号如何移除 有很多小伙伴一开始做开发,一开始用来做测试号,登录微信公众号的时候会提示配置项, 那么如何移除掉呢 https://mp.weixin.qq.com/ 关注「公众平台安全助手」公众号 -> 绑定查询 -> 微信号绑定账号 -> 小程序 -> 点击小程序 -> 解除…

ByteTrack

1. 论文中伪代码表示的流程图 2. 简要版 此图源自: ByteTrack多目标跟踪原理,白老师人工智能学堂 3. 详细版 根据ByteTrack-CPP-ncnn代码的数据流画的较为详细的流程图: 4. ByteTrack-CPP-ncnn的UML类图 Reference ByteTrack多目标跟踪原…

Qt状态机框架

概述 状态机框架提供了用于创建和执行状态图的类。这些概念和符号基于Harel的Statecharts:复杂系统的可视化形式(http://www.wisdom.weizmann.ac.il/~dharel/SCANNED.PAPERS/Statecharts.pdf),也是UML状态图的基础。状态机执行的语义基于状态图XML (SCXML)(http://…

消息队列-分布式消息队列技术选型

Kafka Kafka 是 LinkedIn 开源的一个分布式流式处理平台,已经成为 Apache 顶级项目,早期被用来用于处理海量的日志,后面才慢慢发展成了一款功能全面的高性能消息队列。 流式处理平台具有三个关键功能: 消息队列:发布和…

SQLServer使用 PIVOT 和 UNPIVOT行列转换

在SQL Server中,PIVOT是一个用于将行数据转换为列数据的操作。它特别适用于将多个行中的值转换为多个列的情况,并在此过程中执行聚合操作。以下是关于SQL Server中PIVOT操作的详细解释和示例: 1、本文内容 概述语法备注关键点简单 PIVOT 示…

Linux命令2

文章目录 移动文件或目录mv格式 查找命令/文件存放位目录置which格式 查找文件或目录find格式查找类型多个查找条件逻辑运算符 移动文件或目录 mv 将文件或者目录移动到指定的位置 如果目标的位置和源位置相同,相当于改名操作 跨目录移动相当于window的剪切 格式…

MacOS之解决:开盖启动问题(七十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…