numpy常用函数详解

在深度神经网络代码中经常用到numpy库的一些函数,很多看过之后很容易忘记,本文对经常使用的函数进行归纳总结。

np.arange

arange是numpy一个常用的函数,该函数主要用于创建等差数列。它的使用方法如下所示:

numpy.arange([start,] stop[, step])

参数说明:

  • start:起始值,默认为0
  • stop:结束值(不包含),左闭右开
  • step:步长(可选,默认为1)

注意该函数返回值类型为“<class 'numpy.ndarray'>”

基础用法

import numpy as np

# 1. 只有一个参数(终点)
a = np.arange(5)
print(a)  # [0 1 2 3 4]
print(type(a))  #<class 'numpy.ndarray'> 返回类型

# 2. 指定起点和终点
b = np.arange(2, 6)
print(b)  # [2 3 4 5]

# 3. 指定起点、终点和步长
c = np.arange(0, 10, 2)
print(c)  # [0 2 4 6 8]

# 4. 负步长
d = np.arange(5, -1, -1)
print(d)  # [5 4 3 2 1 0]

另外arange也支持浮点数步长,请看下面的例子

import numpy as np

a = np.arange(1,2,0.2)
print(a)  #[1.0,1.2,1.4,1.6,1.8]

np.array

这是numpy最基础也是最重要的数据结构。array函数创建序列需要从列表或者元组进行创建,这一点是与arange不相同的。

基础用法

import numpy as np

# 1. 从列表创建
arr1 = np.array([1, 2, 3, 4, 5])
print("一维数组:", arr1)

# 2. 从嵌套列表创建多维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:\n", arr2)

# 3. 指定数据类型
arr3 = np.array([1, 2, 3], dtype=float)
print("浮点数数组:", arr3)

# 4. 从元组创建
arr4 = np.array((1, 2, 3))
print("从元组创建:", arr4)

 数组属性

import numpy as np

def array_properties():
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    
    print("维度:", arr.ndim)          # 2
    print("形状:", arr.shape)         # (2, 3)
    print("大小:", arr.size)          # 6
    print("数据类型:", arr.dtype)     # int64
    print("每个元素的字节数:", arr.itemsize)
    print("总字节数:", arr.nbytes)
    print("数据存储顺序:", arr.flags)

常见的数组操作

import numpy as np

# 1. 基本操作
def basic_operations():
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    
    # 重塑
    reshaped = arr.reshape(3, 2)
    print("重塑后:\n", reshaped)
    
    # 转置
    transposed = arr.T
    print("转置后:\n", transposed)
    
    # 展平
    flattened = arr.flatten()
    print("展平后:", flattened)

# 2. 数组切片
def array_slicing():
    arr = np.array([[1, 2, 3, 4], 
                    [5, 6, 7, 8], 
                    [9, 10, 11, 12]])
    
    # 基本切片
    print("前两行:\n", arr[:2])
    print("第二列:", arr[:, 1])
    print("子矩阵:\n", arr[1:3, 1:3])
    
    # 高级索引
    indices = np.array([0, 2])
    print("选择行:", arr[indices])
    
    # 布尔索引
    mask = arr > 5
    print("大于5的元素:", arr[mask])

数组广播

import numpy as np

def broadcasting_examples():
    # 1. 标量广播
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    print("加标量:\n", arr + 1)
    
    # 2. 数组广播
    row = np.array([1, 2, 3])
    print("加行向量:\n", arr + row)
    
    col = np.array([[1], [2]])
    print("加列向量:\n", arr + col)
    
    # 3. 广播规则示例
    a = np.array([[1, 2, 3], [4, 5, 6]])  # shape: (2, 3)
    b = np.array([10, 20, 30])            # shape: (3,)
    print("广播结果:\n", a + b)


broadcasting_examples()
#输出
加标量:
 [[2 3 4]
 [5 6 7]]
加行向量:
 [[2 4 6]
 [5 7 9]]
加列向量:
 [[2 3 4]
 [6 7 8]]
广播结果:
 [[11 22 33]
 [14 25 36]]

视图和副本

def views_and_copies():
    arr = np.array([[1, 2, 3], [4, 5, 6]])
    
    # 视图
    view = arr.view()
    view[0, 0] = 99
    print("原数组被修改:\n", arr)
    
    # 副本
    copy = arr.copy()
    copy[0, 0] = 88
    print("原数组未被修改:\n", arr)

#输出
视图: [[1 2 3]
 [4 5 6]]
原数组被修改:
 [[99  2  3]
 [ 4  5  6]]
原数组未被修改:
 [[99  2  3]
 [ 4  5  6]]

view() 创建一个数组视图,它与原数组共享相同的数据,但可以有不同的形状或数据类型。关键点是:

  • 视图是共享数据的新数组对象
  • 修改视图中的数据会影响原数组
  • 视图的形状改变不影响原数组

 看看下面的例子:

import numpy as np

def dtype_views():
    # 1. 创建整数数组
    arr = np.array([1, 2, 3, 4], dtype=np.int32)
    
    # 2. 创建float类型的视图
    view_float = arr.view(np.float32)
    
    print("原数组:", arr)
    print("原数组类型:", arr.dtype)
    print("原数组id:",id(arr))
    print("视图:", view_float)
    print("视图类型:", view_float.dtype)
    print("原数组id:",id(view_float))
dtype_views()

#输出
原数组: [1 2 3 4]
原数组类型: int32
原数组id: 136153673669328
视图: [1.e-45 3.e-45 4.e-45 6.e-45]
视图类型: float32
原数组id: 136153673387632

通过上面的结果可以看到,view方法返回的对象与原数组的对象id是不同的,但是他们的实际数据是存储在同一个位置的所以修改view,原数组也会修改。这里就不在深入介绍了。

结论:

  • 视图不复制数据,只创建新的数组对象
  • 视图创建了新的数组对象,但指向相同的数据

实际应用场景

import numpy as np

# 1. 数据类型转换而不复制
def efficient_type_conversion():
    # 创建大数组
    arr = np.arange(1000000, dtype=np.int32)
    
    # 使用视图转换类型(高效)
    float_view = arr.view(np.float32)
    
    # 对比复制方式
    float_copy = arr.astype(np.float32)
    
    print("视图是否共享内存:", np.shares_memory(arr, float_view))
    print("副本是否共享内存:", np.shares_memory(arr, float_copy))

# 2. 图像处理中的应用
def image_processing():
    # 创建模拟图像数据
    img = np.array([[1, 2, 3],
                    [4, 5, 6],
                    [7, 8, 9]], dtype=np.uint8)
    
    # 创建展平视图进行处理
    flat_view = img.view()
    flat_view.shape = (-1,)
    
    # 处理数据
    flat_view += 10
    
    print("处理后的图像:\n", img)

np.where

这是一个非常强大的函数,它的主要作用:

  1. 条件查找:返回满足条件的元素索引
  2. 条件选择:根据条件从两个数组中选择元素

条件查找

import numpy as np

def basic_where:
    arr = np.array([1, 2, 3, 4, 5, 4, 3, 2, 1])  #array创建序列需要基于列表创建
    
    #找出所有大于3的索引和对应的值
    indices = np.where(arr > 3)
    print(f'索引:{indices}')
    print(f'对应的值:{arr[indices]}')

    # 找出所有偶数的索引
    even_indices = np.where(arr % 2 == 0)
    print(f"偶数索引: {even_indices}")
    print(f"偶数值: {arr[even_indices]}")

    #多维数组示例
    arr_2d = np.array([
        [1,2,3],
        [4,5,6],
        [7,8,9]])
    
    rows, cols= np.where(arr_2d > 5)
    print("行索引:", rows)  #行索引: [1 2 2 2]
    print("列索引:", cols)  #列索引: [2 0 1 2]
    print("对应的值:", arr_2d[rows, cols]) #对应的值: [6 7 8 9]

    result = np.where(arr_2d > 5)
    print("结果:",result)  #行索引: (array([1, 2, 2, 2]), array([2, 0, 1, 2]))

由此可见,np.where对于二维数组或多维数组进行条件检查,返回的是各个维度索引的组成的元组。

条件选择

import numpy as np

# 基本条件选择
def conditional_selection():
    arr = np.array([1, 2, 3, 4, 5])
    
    # 根据条件选择值:
    # where(condition, x, y) 
    # 当condition为True时选择x,为False时选择y
    result = np.where(arr > 3, arr, -1)
    print(result)  # [-1 -1 -1  4  5]
    
    # 使用数组作为替换值
    result2 = np.where(arr % 2 == 0, arr * 2, arr * 3)
    print(result2)  # [3 4 9 8 15]

# 多维数组条件选择
def multidim_conditional():
    arr_2d = np.array([
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ])
    
    # 将大于5的元素替换为100
    result = np.where(arr_2d > 5, 100, arr_2d)
    print(result)  #[[  1   2   3]
                    # [  4   5 100]
                     #[100 100 100]]
        

np.linspace

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

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

相关文章

【SpringBoot】深入解析 Maven 的操作与配置

Maven 1.什么是Maven? Maven是一个项目管理工具&#xff0c;通过pom.xml文件的配置获取jar包&#xff0c;而不用手动去添加jar包&#xff1b; 2. 创建一个Maven项目 IDEA本身已经集成了Maven&#xff0c;我们可以直接使用&#xff0c;无需安装 以下截图的idea版本为&#xff…

MySQL的安装以及数据库的基本配置

MySQL的安装及配置 MySQL的下载 选择想要安装的版本&#xff0c;点击Download下载 Mysql官网下载地址&#xff1a;​ ​https://downloads.mysql.com/archives/installer/​​ MySQL的安装 选择是自定义安装&#xff0c;所以直接选择“Custom”&#xff0c;点击“Next”​ …

Manus AI : Agent 元年开启.pdf

Manus AI : Agent 元年开启.pdf 是由华泰证券出品的一份调研报告&#xff0c;共计23页。报告详细介绍了Manus AI 及 Agent&#xff0c;主要包括Manus AI 的功能、优势、技术能力&#xff0c;Agent 的概念、架构、应用场景&#xff0c;以及 AI Agent 的类型和相关案例&#xff0…

2.数据结构-栈和队列

数据结构-栈和队列 2.1栈2.1.1栈的表示和实现2.1.2栈的应用举例数制转换括号匹配检验迷宫给求解表达式求值 2.1.3链栈的表示和实现2.1.4栈与递归的实现遍历输出链表中各个结点的递归算法*Hanoi塔问题的递归算法 2.2队列2.2.1循环队列——队列的顺序表示和实现2.2.2链队——队列…

(十七) Nginx解析:架构设计、负载均衡实战与常见面试问题

什么是Nginx? Nginx 是一款高性能的 HTTP 服务器和反向代理服务器&#xff0c;同时支持 IMAP/POP3/SMTP 协议。其设计以高并发、低资源消耗为核心优势&#xff0c;广泛应用于负载均衡、静态资源服务和反向代理等场景。 一、Nginx 的核心优势 高并发处理能力采用异步非阻塞的…

Cpu100%问题(包括-线上docker服务以及Arthas方式进行处理)

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

【大模型】WPS 接入 DeepSeek-R1详解,打造全能AI办公助手

目录 一、前言 二、WPS接入AI工具优势​​​​​​​ 三、WPS接入AI工具两种方式 3.1 手动配置的方式 3.2 Office AI助手 四、WPS手动配置方式接入AI大模型 4.1 安装VBA插件 4.1.1 下载VBA插件并安装 4.2 配置WPS 4.3 WPS集成VB 4.4 AI助手效果测试 4.5 配置模板文…

架构思维:高性能架构_01基础概念

文章目录 概述基础概念性能指标利特尔法则&#xff08;O T L&#xff09;系统优化策略1. 降低耗时&#xff08;L↓&#xff09;2. 增加容量&#xff08;O↑&#xff09;3. 增加时延&#xff08;L↑&#xff09; 场景化指标选择响应时间优先吞吐量/容量优先平衡策略 概述 一个…

解决stylelint对deep报错

报错如图 在.stylelintrc.json的rules中配置 "selector-pseudo-class-no-unknown": [true,{"ignorePseudoClasses": ["deep"]} ]

VScode 中文符号出现黄色方框的解决方法

VScode 中文符号出现黄色方框的解决方法 我的vscode的python多行注释中会将中文字符用黄色方框框处&#xff1a; 只需要打开设置搜索unicode&#xff0c;然后将这一项的勾选取消掉就可以了&#xff1a; 取消之后的效果如下&#xff1a; 另一种情况&#xff1a;中文显示出现黄色…

大模型架构记录2

一 应用场景 1.1 prompt 示例 1.2 自己搭建一个UI界面&#xff0c;调用接口 可以选用不同的模型&#xff0c;需要对应的API KEY 二 Agent 使用 2.1 构建GPT

深度学习实战车辆目标跟踪与计数

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化&#xff0c;该数据集包含丰富的车辆目标图像样本…

升级到Android Studio 2024.2.2 版本遇到的坑

一、上来就编译报错&#xff0c;大概率是因为选择了替换安装&#xff0c;本地配置文件出错 找到本地当前版本的配置文件&#xff0c;删掉&#xff0c;重启studio就好了&#xff1a; 1、打开终端 2、“cd /Users/用户名/Library/Application\ Support/Google” //到Google目录 …

Git - 补充工作中常用的一些命令

Git - 补充工作中常用的一些命令 1 一些场景1.1 场景11.2 场景21.3 场景31.4 场景41.5 场景51.6 场景61.7 场景71.8 场景81.9 场景91.10 场景101.11 场景111.12 场景121.13 场景131.14 场景141.15 场景15 2 git cherry-pick \<commit-hash\> 和 git checkout branch \-\-…

【网络安全工程】任务11:路由器配置与静态路由配置

目录 一、概念 二、路由器配置 三、配置静态路由CSDN 原创主页&#xff1a;不羁https://blog.csdn.net/2303_76492156?typeblog 一、概念 1、路由器的作用&#xff1a;通过路由表进行数据的转发。 2、交换机的作用&#xff1a;通过学习和识别 MAC 地址&#xff0c;依据 M…

如何用更少的内存训练你的PyTorch模型?深度学习GPU内存优化策略总结

在训练大规模深度学习模型时&#xff0c;GPU 内存往往成为关键瓶颈&#xff0c;尤其是面对大型语言模型&#xff08;LLM&#xff09;和视觉 Transformer 等现代架构时。由于大多数研究者和开发者难以获得配备海量 GPU 内存的高端计算集群&#xff0c;掌握高效的内存优化技术至关…

Dify+DeepSeek | Excel数据一键可视化(创建步骤案例)(echarts助手.yml)(文档表格转图表、根据表格绘制图表、Excel绘制图表)

Dify部署参考&#xff1a;Dify Rag部署并集成在线Deepseek教程&#xff08;Windows、部署Rag、安装Ragan安装、安装Dify安装、安装ollama安装&#xff09; DifyDeepSeek - Excel数据一键可视化&#xff08;创建步骤案例&#xff09;-DSL工程文件&#xff08;可直接导入&#x…

linux下ollama离线安装

一、离线安装包下载地址 直接下载地址&#xff1a; https://github.com/ollama/ollama/releases/tag/v0.5.12 网络爬取地址&#xff1a; MacOS https://ollama.com/download/Ollama-darwin.zip Linux curl -fsSL https://ollama.com/install.sh | sh Windows https://olla…

MAC 搭建Dify+DeepSeek-R1整合部署

在开始安装之前&#xff0c;我们需要确保系统满足以下基本要求&#xff1a; CPU至少2核心内存至少4GB&#xff08;建议8GB以上&#xff09;硬盘空间至少20GB&#xff08;为了后续扩展&#xff09;操作系统支持&#xff1a;Windows、macOS或LinuxDocker环境 1. dify的安装步骤…

OpenManus介绍及本地部署体验

1.OpenManus介绍 OpenManus&#xff0c;由 MetaGPT 团队精心打造的开源项目&#xff0c;于2025年3月发布。它致力于模仿并改进 Manus 这一封闭式商业 AI Agent 的核心功能&#xff0c;为用户提供无需邀请码、可本地化部署的智能体解决方案。换句话说&#xff0c;OpenManus 就像…