numpy常用函数详解

news2025/3/10 13:59:24

在深度神经网络代码中经常用到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

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

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

相关文章

安装树莓派3B+环境(嵌入式开发)

一、环境配置 1、下载树莓派镜像工具 点击进入下载连接 进入网站&#xff0c;点击下载即可。 2、配置wifi及ssh 将SD卡插入读卡器&#xff0c;再接入电脑&#xff0c;随后打开Raspberry Pi Imager下载工具&#xff0c; 选择Raspberry Pi 3 选择64位的操作系统 选择SD卡 选择…

p5.js:sound(音乐)可视化,动画显示音频高低变化

本文通过4个案例介绍了使用 p5.js 进行音乐可视化的实践&#xff0c;包括将音频振幅转化为图形、生成波形图。 承上一篇&#xff1a;vite&#xff1a;初学 p5.js demo 画圆圈 cd p5-demo copy .\node_modules\p5\lib\p5.min.js . copy .\node_modules\p5\lib\addons\p5.soun…

Linux下安装elasticsearch(Elasticsearch 7.17.23)

Elasticsearch 是一个分布式的搜索和分析引擎&#xff0c;能够以近乎实时的速度存储、搜索和分析大量数据。它被广泛应用于日志分析、全文搜索、应用程序监控等场景。 本文将带你一步步在 Linux 系统上安装 Elasticsearch 7.17.23 版本&#xff0c;并完成基本的配置&#xff0…

【The Rap of China】2018

中国新说唱第一季&#xff0c;2018 2018年4月13日&#xff0c;该节目通过官方微博宣布&#xff0c;其第二季将更名为《中国新说唱》。 《中国新说唱2018》由张震岳、MC Hotdog、潘玮柏、邓紫棋、WYF 担任明星制作人&#xff1b; 艾热获得冠军、那吾克热玉素甫江获得亚军、ICE…

通义万相2.1开源版本地化部署攻略,生成视频再填利器

2025 年 2 月 25 日晚上 11&#xff1a;00 通义万相 2.1 开源发布&#xff0c;前两周太忙没空搞它&#xff0c;这个周末&#xff0c;也来本地化部署一个&#xff0c;体验生成效果如何&#xff0c;总的来说&#xff0c;它在国内文生视频、图生视频的行列处于领先位置&#xff0c…

好玩的谷歌浏览器插件-自定义谷歌浏览器光标皮肤插件-Chrome 的自定义光标

周末没有啥事 看到了一个非常有意思的插件 就是 在使用谷歌浏览器的时候&#xff0c;可以把鼠标的默认样式换一个皮肤。就像下面的这种样子。 实际谷歌浏览器插件开发对于有前端编程基础的小伙伴 还是比较容易的&#xff0c;实际也是写 html css js 。 所以这个插件使用的技术…

svn删除所有隐藏.svn文件,文件夹脱离svn控制

新建一个文件&#xff0c;取名remove-svn-folders.reg&#xff0c;输入如下内容&#xff1a; Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] "Delete SVN Folders" [HKEY_LOCAL_MACHINE\SOFTWARE\Class…

六十天前端强化训练之第十二天之闭包深度解析

欢迎来到编程星辰海的博客讲解 目录 第一章&#xff1a;闭包的底层运行机制 1.1 词法环境&#xff08;Lexical Environment&#xff09;的构成JavaScript 引擎通过三个关键组件管理作用域&#xff1a; 1.2 作用域链的创建过程当函数被定义时&#xff1a; 1.3 闭包变量的生命…

DeepSeek R1-32B医疗大模型的完整微调实战分析(全码版)

DeepSeek R1-32B微调实战指南 ├── 1. 环境准备 │ ├── 1.1 硬件配置 │ │ ├─ 全参数微调:4*A100 80GB │ │ └─ LoRA微调:单卡24GB │ ├── 1.2 软件依赖 │ │ ├─ PyTorch 2.1.2+CUDA │ │ └─ Unsloth/ColossalAI │ └── 1.3 模…

10.2 继承与多态

文章目录 继承多态 继承 继承的作用是代码复用。派生类自动获得基类的除私有成员外的一切。基类描述一般特性&#xff0c;派生类提供更丰富的属性和行为。在构造派生类时&#xff0c;其基类构造函数先被调用&#xff0c;然后是派生类构造函数。在析构时顺序刚好相反。 // 基类…

[网络爬虫] 动态网页抓取 — Selenium 元素定位

&#x1f31f;想系统化学习爬虫技术&#xff1f;看看这个&#xff1a;[数据抓取] Python 网络爬虫 - 学习手册-CSDN博客 在使用 Selenium 时&#xff0c;往往需要先定位到指定元素&#xff0c;然后再执行相应的操作。例如&#xff0c;再向文本输入框中输入文字之前&#xff0c;…

静态网页的爬虫(以电影天堂为例)

一、电影天堂的网址&#xff08;url&#xff09; 电影天堂_免费电影_迅雷电影下载_电影天堂网最好的迅雷电影下载网&#xff0c;分享最新电影&#xff0c;高清电影、综艺、动漫、电视剧等下载&#xff01;https://dydytt.net/index.htm 我们要爬取这个页面上的内容 二、代码…

Android设备是如何进入休眠的呢?

首先我们手机灭屏后&#xff0c;一般需要等一段时间CPU才真正进入休眠。即Android设备屏幕暗下来的时候&#xff0c;并不是立即就进入了休眠模式&#xff1b;当所有唤醒源都处于de-avtive状态后&#xff0c;系统才会进入休眠。在手机功耗中从灭屏开始到CPU进入休眠时间越短&…

ctfshow做题笔记—栈溢出—pwn65~pwn68

目录 前言 一、pwn65(你是一个好人) 二、pwn66(简单的shellcode&#xff1f;不对劲&#xff0c;十分得有十二分的不对劲) 三、pwn67(32bit nop sled)&#xff08;确实不会&#xff09; 四、pwn68(64bit nop sled) 前言 做起来比较吃力哈哈&#xff0c;自己还是太菜了&…

JS中的闭包(closures)一种强大但易混淆的概念

JavaScript 中的闭包&#xff08;closures&#xff09;被认为是一种既强大又易混淆的概念。闭包允许函数访问其外部作用域的变量&#xff0c;即使外部函数已执行完毕&#xff0c;这在状态维护和回调函数中非常有用。但其复杂性可能导致开发者的误解&#xff0c;尤其在变量捕获和…

Element使用

Element(美化网页&#xff09; ElementUI的使用注意事项&#xff1a; Element.ui的使用基于Vue环境&#xff0c;于是Element相关组件的使用必须放在Vue对象绑定的视图中去 ElementUI的JS库的引入必须放在vue.js库的后面 <!-- 引入样式 --><link rel"styleshee…

基于YOLO11深度学习的电瓶车进电梯检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

R语言的基础命令及实例操作

> T & F [1] FALSE > T & T [1] TRUE > T | F [1] TRUE > F | F [1] FALSE > a <- c(T,F,T) > b <- c(F,F,T) > a & b [1] FALSE FALSE TRUE > a | b [1] TRUE FALSE TRUE 在 R 中&#xff0c;大小写是敏感的&#xff0c;也就是说…

知识蒸馏综述Knowledge Distillation: A Survey解读

论文链接&#xff1a;Knowledge Distillation: A Survey 摘要&#xff1a;近年来&#xff0c;深度神经网络在工业界和学术界都取得了成功&#xff0c;尤其是在计算机视觉任务方面。深度学习的巨大成功主要归功于它能够扩展以对大规模数据进行编码&#xff0c;并且能够处理数十…

第十五届蓝桥杯省赛电子类单片机学习过程记录(客观题)

客观试题: 01.典型的BUCK电源电路包含哪些关键器件(ABCD) A. 电容 B. 二极管 C. 电感 D. MOSFET 解析: 典型的 BUCK 电源电路是一种降压型的直流-直流转换电路,它包含以下关键器件: A.电容:电容在电路中起到滤波的作用。输入电容用于平滑输入电压的波动,减少电源噪声对…