深入解析:Python进阶第三方库之Numpy

news/2025/9/21 10:36:22/文章来源:https://www.cnblogs.com/yxysuanfa/p/19103269

了解Numpy运算速度上的优势

知道数组的属性,形状、类型

应用Numpy实现数组的基本操作

应用随机数组的创建实现正态分布应用

应用Numpy实现数组的逻辑运算a

应用Numpy实现数组的统计运算

应用Numpy实现数组之间的运算

一、Numpy优势

Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。

Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。

Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

NumPy提供了一个N维数组类型ndarray,它描述了相同类型的“items”的集合。

用ndarray进行存储:

import numpy as np
# 创建ndarray
score = np.array(
[[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])
score

返回结果:

array([[80, 89, 86, 67, 79],

[78, 97, 89, 67, 81],

[90, 94, 78, 67, 74],

[91, 91, 90, 67, 69],

[76, 87, 75, 67, 86],

[70, 79, 84, 67, 84],

[94, 92, 93, 67, 64],

[86, 85, 83, 67, 80]])

ndarrayPython原生list运算效率对比

在这里我们通过一段代码运行来体会到ndarray的好处

import random

import time

import numpy as np

a = []

for i in range(100000000):

a.append(random.random())

# 通过%time魔法方法, 查看当前行的代码运行一次所花费的时间

%time sum1=sum(a)

b=np.array(a)

%time sum2=np.sum(b)

其中第一个时间显示的是使用原生Python计算时间,第二个内容是使用numpy计算时间:

CPU times: user 852 ms, sys: 262 ms, total: 1.11 s

Wall time: 1.13 s

CPU times: user 133 ms, sys: 653 µs, total: 133 ms

Wall time: 134 ms

从中我们看到ndarray的计算速度要快很多,节约了时间。

Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优 势就越明显。

二、效率远高于纯Python代码

Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,所以,其效率远高于纯 Python代码。

ndarray的属性

属性名字 属性解释                                       

数组维度的元组                             ndarray.shape

数组维数                                       ndarray.ndim

数组中的元素数量                        ndarray.size

一个数组元素的长度(字节)       ndarray.itemsize

数组元素的类型                                ndarray.dtype

ndarray的形状

首先创建一些数组。

# 创建不同形状的数组
>>> a = np.array([[1,2,3],[4,5,6]])
>>> b = np.array([1,2,3,4])
>>> c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])

分别打印出形状

>>> a.shape

>>> b.shape

>>> c.shape

(2, 3) # 二维数组

(4,) # 一维数组

(2, 2, 3) # 三维数组

ndarray的类型

>>> type(score.dtype)

<type 'numpy.dtype'>

创建数组的时候指定类型

注意:若不指定,整数默认int64,小数默认float64

三、生成数组的方法

生成01的数组

np.ones(shape, dtype)

np.ones_like(a, dtype)

np.zeros(shape, dtype)

np.zeros_like(a, dtype)

ones = np.ones([4,8])

ones

返回结果:

array([[1., 1., 1., 1., 1., 1., 1., 1.],

[1., 1., 1., 1., 1., 1., 1., 1.],

[1., 1., 1., 1., 1., 1., 1., 1.],

[1., 1., 1., 1., 1., 1., 1., 1.]])

np.zeros_like(ones)

返回结果:

array([[0., 0., 0., 0., 0., 0., 0., 0.],

[0., 0., 0., 0., 0., 0., 0., 0.],

[0., 0., 0., 0., 0., 0., 0., 0.],

[0., 0., 0., 0., 0., 0., 0., 0.]])

从现有数组生成

生成方式

np.array(object, dtype)

np.asarray(a, dtype)

a = np.array([[1,2,3],[4,5,6]])

# 从现有的数组当中创建

a1 = np.array(a)

# 相当于索引的形式,并没有真正的创建一个新的

a2 = np.asarray(a)

生成固定范围的数组

np.linspace (start, stop, num, endpoint)

创建等差数组 — 指定数量

参数:

start:序列的起始值

stop:序列的终止值

num:要生成的等间隔样例数量,默认为50

endpoint:序列中是否包含stop值,默认为ture

# 生成等间隔的数组

np.linspace(0, 100, 11)

返回结果:

array([ 0., 10., 20., 30., 40., 50., 60., 70., 80., 90., 100.])

np.arange(start,stop, step, dtype)

创建等差数组 — 指定步长

参数

step:步长,默认值为1

np.arange(10, 50, 2)

返回结果:

array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,44, 46, 48])

np.logspace(start,stop, num)

创建等比数列

参数:

num:要生成的等比数列数量,默认为50

# 生成10^x

np.logspace(0, 2, 3)

返回结果:

array([ 1., 10., 100.])

生成随机数组

使用模块介绍

np.random模块

np.random.randn(d0, d1, …, dn)

功能:从标准正态分布中返回一个或多个样本值

np.random.normal(loc=0.0, scale=1.0, size=None)

loc:float

此概率分布的均值(对应着整个分布的中心centre)

scale:float

此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)

size:int or tuple of ints

输出的shape,默认为None,只输出一个值

np.random.standard_normal(size=None)

返回指定形状的标准正态分布的数组。

举例1:生成均值为1.75,标准差为1的正态分布数据,100000000

x1 = np.random.normal(1.75, 1, 100000000)

返回结果:

array([2.90646763, 1.46737886, 2.21799024, ..., 1.56047411, 1.87969135,

0.9028096 ])

均匀分布

np.random.rand(d0, d1, ..., dn)

返回[0.01.0)内的一组均匀分布的数。

np.random.uniform(low=0.0, high=1.0, size=None)

功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.

参数介绍:

low: 采样下界,float类型,默认值为0;

high: 采样上界,float类型,默认值为1;

size: 输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出mnk个样本,缺省时输出1个值。

返回值:ndarray类型,其形状和参数size中描述一致。

np.random.randint(low, high=None, size=None, dtype='l')

从一个均匀分布中随机采样,生成一个整数或N维整数数组,

取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。

# 生成均匀分布的随机数

x2 = np.random.uniform(-1, 1, 100000000)

返回结果:

array([ 0.22411206, 0.31414671, 0.85655613, ..., -0.92972446,

0.95985223, 0.23197723])

四、数组的索引、切片

一维、二维、三维的数组如何索引?

直接进行索引,切片

对象[:, :] -- 先行后列

二维数组索引方式:

举例:获取第一个股票的前3个交易日的涨跌幅数据

# 二维的数组,两个维度

stock_change[0, 0:3]

返回结果:

array([-0.03862668, -1.46128096, -0.75596237])

三维数组索引方式:

# 三维

a1 = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])

# 返回结果

array([[[ 1, 2, 3],

[ 4, 5, 6]],

[[12, 3, 34],

[ 5, 6, 7]]])

# 索引、切片

>>> a1[0, 0, 1] # 输出:

形状修改

ndarray.reshape(shape, order)

返回一个具有相同数据域,但shape不一样的视图

行、列不进行互换

# 在转换形状的时候,一定要注意数组的元素匹配

stock_change.reshape([5, 4])

stock_change.reshape([-1,10]) # 数组的形状被修改为: (2, 10), -1: 表示通过待计算

ndarray.resize(new_shape)

修改数组本身的形状(需要保持元素个数前后相同)

行、列不进行互换

stock_change.resize([5, 4])

# 查看修改后结果

stock_change.shape

(5, 4)

ndarray.T

数组的转置

将数组的行、列进行互换

stock_change.T.shape

(4, 5)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

17.生成器和推导式 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

知行合一

都说,人赚不到认知之外的钱,这句话是真理。这些年,做生意创业的过程中,也发现了一个法则——寒门的孩子想改命,只有一条路,叫改脑,升认知。当我见到一个人时,只需要了解一下,他当下每天时间用在哪里,在跟谁在…

Manim实现水波纹特效

本文将介绍如何使用ManimCE框架实现一个水波纹特效,让你的数学动画更加生动有趣。 1. 实现原理 水波纹特效通过WaterRipple类实现,这是一个自定义的Animation子类。让我们从代码角度来分析其实现原理: 1.1. 核心数据…

CSP 2025 S1 游记

CSP 2025 S1 游记想到这可能是我最后一个赛季打 OI ,还是留下点东西记录 暑假 由于没有认真考虑过考不上XJ本部的情况,所以没有三连签,之后填的是杭高、学紫。结果tmd连杭高都没上,遂至学紫。学校举办了十天“夏令…

深入解析:解锁AI智能体:上下文工程如何成为架构落地的“魔法钥匙”

深入解析:解锁AI智能体:上下文工程如何成为架构落地的“魔法钥匙”pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

JS之使用for...of赋值失败的原因分析

原代码为for (let tab of tabList.value) {const subFormData = subOrderListMap.value[tab.subFormWebUuid];debuggerif (subFormData) {tab.formStatus = "已完成";tab = { ...subFormData, ...tab };} }这…

Linux /lib/modules/$(uname -r)/ 目录功能作用详解

Linux /lib/modules/$(uname -r)/ 目录功能作用详解Linux 系统中的 /lib/modules/$(uname -r)/目录非常重要,它承载着与当前运行内核版本严格对应的​​内核模块​​及其相关的管理文件。理解这个目录,对你高效管理…

《建筑的永恒之道》第 27 章:道之核心

从你至此所读列的看起来,仿佛建筑的生活以及它们充满生气时所具有的永恒特征可以简单地靠使用模式语言来创造。若是人们有了一种有活力的语言,仿佛其建筑行为所产生的东西都将是有生气的,仿佛城市的生活可以简单地靠…

软件工程第二次作业_个人项目

Github连接: Ender39831/3123004694: homework ](https://github.com/Ender39831/3123004694)这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience这个作业要求在哪里 https://e…

Linux命令大全(档案管理)

Linux命令大全(档案管理)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

小狼毫雾凇拼音安装部署

I. 资源链接 小狼毫官网:RIME | 中州韻輸入法引擎 雾凇拼音仓库:iDvel/rime-ice

Chapter 3 Resize and Cropping

img = cv2.imread(images/lambo.png) # (462, 623, 3) print(img.shape)# 先是width(x轴),然后是height(y轴),可以看出 resize 是放大或缩小并不是裁剪 imgResized = cv2.resize(img, (300, 200)) # 这里是He…

详细介绍:java中常见的几种排序算法

详细介绍:java中常见的几种排序算法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

Linux 内核VRF

Linux 内核VRFVirtual Routing and Forwarding (VRF) 由路由表+网络设备组成。 加载vrf内核模块 modprobe vrf 基本操作 # 创建并拉起vrf设备 # 自动创建路由表1 ip link add vrf1 type vrf table 1 ip link set dev v…

使用FFmpeg转换m4a

在Linux下可以使用FFmpeg将m4a文件转换为mp3文件,如下 ffmpeg -i input.m4a -vn -acodec libmp3lame -ab 320k output.mp3其中-i 是输入文件 -vn 是不包括视频 -acodec libmp3lame 是指定 LAME MP3 解编码器 -ab 320k…

提升多屏监控体验/新增辅屏预览功能/轻松实现跨屏实时监控/支持高达500路多个屏幕同时显示

一、前言说明 随着监控系统规模的不断扩大,以及用户对多屏协同操作需求的日益增长,如何高效、灵活地预览大量实时视频通道,成为提升用户体验的关键。尤其是在拥有多个显示器的环境中,用户越来越希望能够在不同屏幕…

[Java SE/文件系统/IO] 核心源码精讲:java.io.File

1 概述:java.io.File Java 流(Stream)、文件(File)和IOJava 中的流(Stream)、文件(File)和 IO(输入输出)是处理数据读取和写入的基础设施它们允许程序与外部数据(如文件、网络、系统输入等)进行交互。java.io…

Linux 内核整体架构详解

Linux 内核整体架构详解Linux 内核是操作系统的核心,其精妙的设计使得它能够高效地管理硬件资源,并为上层应用程序提供稳定的运行环境。下面我将为你详细解析 Linux 内核的结构,包括其整体架构、核心子系统、模块化…

Ubuntu 磁盘扩容与扩容失败障碍解决( df -h 与 GParted 显示空间不一致的问题 -LVM)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

httplb 服务器

#include <iostream> #include "httplib.h" using namespace std; using namespace httplib; int main(){Server svr;svr.Get("/",[](const Request& req,Response& res){res.s…