深入解析NumPy的核心函数np.array

    • NumPy与np.array()简介
      • NumPy的重要性
      • np.array()的作用
    • np.array()函数的详细参数
      • object参数
      • dtype参数
      • copy参数
      • order参数
      • subok参数
      • ndmin参数
      • like参数
    • np.array()函数的使用示例
      • 创建基本的一维和二维数组
      • 创建具有特定数据类型的数组
      • 创建多维数组
      • 从其他数据结构转换为数组
      • 使用ndmin参数创建具有最小维度的数组
    • np.array()函数与与Python原生列表的比较

NumPy为Python提供了高效的多维数组对象以及一系列用于处理这些数组的工具,极大地简化了数值计算的过程。而np.array()作为NumPy库的核心函数之一,是创建和操作数组的基础。

NumPy与np.array()简介

NumPy(Numerical Python的简称)是Python中用于处理数组运算的扩展库,它提供了大量的数学函数来操作数组,使得数组的处理变得高效且简洁。np.array()则是NumPy库中的一个基础函数,用于创建数组。

NumPy的重要性

NumPy在科学计算、数据分析、机器学习等众多领域都有着广泛的应用。它的高效性源于其底层使用C语言实现,能够充分利用计算机的硬件资源,对数组进行快速的运算。与Python原生的列表相比,NumPy数组在内存中是连续存储的,这使得数组元素之间的访问和计算更为高效。例如,在进行大规模的数据处理时,使用NumPy数组可以显著提高程序的运行速度。

np.array()的作用

np.array()函数的主要作用是将Python中的各种数据结构(如列表、元组等)转换为NumPy数组,或者根据指定的参数创建一个新的数组。通过np.array()创建的数组可以方便地进行各种数学运算、索引和切片操作,为后续的数据处理和分析提供了基础。

np.array()函数的详细参数

np.array()函数的完整语法为:numpy.array(object, dtype = None, *, copy = True, order = 'K', subok = False, ndmin = 0, like = None)。下面我们来详细介绍每个参数的含义和用法。

object参数

object参数是必填项,它表示要转换为数组的对象,可以是一个数组、任何暴露数组接口的对象、其__array__方法返回数组的对象,或者任何(嵌套的)序列。如果object是一个标量,则返回一个包含该标量的0维数组。

例如,我们可以使用列表来创建一个一维数组:

import numpy as np
arr_1d = np.array([1, 2, 3, 4, 5])
print(arr_1d)

输出结果为:[1 2 3 4 5]

也可以使用嵌套列表来创建一个二维数组:

arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr_2d)

输出结果为:

[[1 2 3][4 5 6][7 8 9]]

dtype参数

dtype参数用于指定数组的数据类型,它是可选的。如果不指定dtype,NumPy会根据传入的数据自动推断出合适的数据类型。例如:

arr = np.array([1, 2, 3])
print(arr.dtype)

输出结果为:int64

在这个例子中,由于传入的数据都是整数,NumPy自动推断出数组的数据类型为int64

然而,在某些情况下,我们可能需要显式地指定数据类型,以满足特定的需求。比如,当我们需要创建一个包含浮点数的数组时,可以这样做:

arr_float = np.array([1, 2, 3], dtype = np.float32)
print(arr_float.dtype)

输出结果为:float32

通过指定dtype = np.float32,我们创建了一个数据类型为32位浮点数的数组。

指定数据类型的好处之一是可以优化内存使用。例如,如果我们知道数组中的数据范围较小,并且不需要高精度的计算,可以使用较小的数据类型,如int8float16,这样可以减少内存的占用。

copy参数

copy参数用于控制是否复制数据,它是一个布尔值,默认为True。当copy = True时,无论输入数据的来源如何,都会创建一个数据的副本;当copy = False时,如果输入数据本身就是一个NumPy数组,并且不需要进行任何数据类型转换或其他修改,那么将不会复制数据,而是直接使用原数组的引用。

需要注意的是,当copy = None时,只有在__array__返回副本、obj是嵌套序列或需要满足其他要求(如dtypeorder等)时才会进行复制。

例如,下面的代码中,由于输入数据是一个列表,所以无论copy参数的值如何,都会创建一个新的数组副本:

list_data = [1, 2, 3]
arr1 = np.array(list_data, copy = True)
arr2 = np.array(list_data, copy = False)
arr3 = np.array(list_data, copy = None)
print(arr1 is arr2)  # False
print(arr1 is arr3)  # False

输出结果均为False,说明arr1arr2arr3都是不同的数组对象。

而当输入数据是一个NumPy数组时,如果copy = False且不需要进行其他修改,那么将不会复制数据:

arr4 = np.array([1, 2, 3])
arr5 = np.array(arr4, copy = False)
print(arr4 is arr5)  # True

输出结果为True,说明arr4arr5指向同一个数组对象。

order参数

order参数用于指定数组在内存中的存储顺序,它有四个可选值:'K''A''C''F'

  • 'C'表示按C语言的行优先顺序存储,即先存储第一行,再存储第二行,以此类推。
  • 'F'表示按Fortran语言的列优先顺序存储,即先存储第一列,再存储第二列,以此类推。
  • 'A'表示如果输入数据是Fortran连续的,则按'F'顺序存储,否则按'C'顺序存储。
  • 'K'表示尽可能保持输入数据的原始顺序。

默认情况下,order = 'K'

例如,我们可以通过order参数来控制二维数组的存储顺序:

arr_2d_c = np.array([[1, 2, 3], [4, 5, 6]], order = 'C')
arr_2d_f = np.array([[1, 2, 3], [4, 5, 6]], order = 'F')
print(arr_2d_c.flags)
print(arr_2d_f.flags)

输出结果分别为:

C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False

从输出结果可以看出,arr_2d_c是按行优先顺序存储的(C_CONTIGUOUS : True),而arr_2d_f是按列优先顺序存储的(F_CONTIGUOUS : True)。

subok参数

subok参数是一个布尔值,默认为False。当subok = True时,返回的数组将保留输入数据的子类类型;当subok = False时,无论输入数据的类型如何,返回的数组都将被强制转换为基类ndarray类型。

例如,假设我们有一个自定义的数组子类MyArray,它继承自np.ndarray

class MyArray(np.ndarray):pass
data = MyArray([1, 2, 3])
arr1 = np.array(data, subok = True)
arr2 = np.array(data, subok = False)
print(type(arr1))  # <class '__main__.MyArray'>
print(type(arr2))  # <class 'numpy.ndarray'>

输出结果表明,当subok = True时,arr1仍然是MyArray类型;而当subok = False时,arr2被转换为了np.ndarray类型。

ndmin参数

ndmin参数用于指定返回数组的最小维度,它是一个整数,默认为0。如果输入数据的维度小于ndmin,则会在数组的形状前面添加一维,直到满足最小维度的要求。

例如:

arr1 = np.array([1, 2, 3], ndmin = 1)
arr2 = np.array([1, 2, 3], ndmin = 2)
arr3 = np.array([1, 2, 3], ndmin = 3)
print(arr1.shape)  # (3,)
print(arr2.shape)  # (1, 3)
print(arr3.shape)  # (1, 1, 3)

在这个例子中,输入数据[1, 2, 3]是一个一维数组。当ndmin = 1时,数组形状不变;当ndmin = 2时,在前面添加了一维,变成了二维数组(1, 3);当ndmin = 3时,在前面添加了两维,变成了三维数组(1, 1, 3)

like参数

like参数是在NumPy 1.20.0版本中新增的,它用于指定一个参考对象,以便创建与该对象兼容的数组。如果传入的like参数支持__array_function__协议,那么结果将由该协议定义。

例如:

arr = np.array([1, 2, 3])
new_arr = np.array([4, 5, 6], like = arr)
print(type(new_arr))  # <class 'numpy.ndarray'>

在这个例子中,我们以arr为参考对象,创建了一个新的数组new_arrnew_arr的类型与arr相同,都是np.ndarray

np.array()函数的使用示例

创建基本的一维和二维数组

如前文所述,使用np.array()函数可以很方便地创建一维和二维数组。
创建一维数组:

arr_1d = np.array([1, 2, 3, 4, 5])
print(arr_1d)

创建二维数组:

arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr_2d)

创建具有特定数据类型的数组

通过dtype参数,我们可以创建具有特定数据类型的数组。
创建整数类型的数组:

arr_int = np.array([1, 2, 3], dtype = np.int16)
print(arr_int.dtype)

创建浮点数类型的数组:

arr_float = np.array([1.0, 2.0, 3.0], dtype = np.float64)
print(arr_float.dtype)

创建复数类型的数组:

arr_complex = np.array([1 + 1j, 2 + 2j, 3 + 3j], dtype = np.complex128)
print(arr_complex.dtype)

创建多维数组

np.array()函数不仅可以创建一维和二维数组,还可以创建更高维度的数组。只需在传入的序列中嵌套更多的层级即可。
创建三维数组:

arr_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr_3d)

输出结果为:

[[[1 2][3 4]][[5 6][7 8]]]

从其他数据结构转换为数组

除了使用列表和元组来创建数组外,np.array()函数还可以将其他数据结构转换为数组。
将集合转换为数组:

set_data = {1, 2, 3, 3}  # 集合会自动去重
arr_set = np.array(set_data)
print(arr_set)

输出结果为:[1 2 3]

将字符串转换为数组:

str_data = "hello"
arr_str = np.array(list(str_data))
print(arr_str)

输出结果为:['h' 'e' 'l' 'l' 'o']

使用ndmin参数创建具有最小维度的数组

通过ndmin参数,我们可以确保创建的数组具有指定的最小维度。

arr1 = np.array([1, 2, 3], ndmin = 2)
print(arr1.shape)  # (1, 3)
arr2 = np.array([1, 2, 3], ndmin = 3)
print(arr2.shape)  # (1, 1, 3)

np.array()函数与与Python原生列表的比较

虽然Python原生列表也可以存储多个元素,但与NumPy数组相比,它们有很多不同之处。

  1. 内存存储:NumPy数组在内存中是连续存储的,而Python列表是离散存储的。这使得NumPy数组在进行数值计算时能够更高效地利用内存,提高计算速度。
  2. 数据类型:NumPy数组中的所有元素必须是同一数据类型,而Python列表可以包含不同数据类型的元素。这使得NumPy数组在进行数学运算时更加高效,因为不需要进行类型检查和转换。
  3. 运算效率:由于NumPy数组的内存存储方式和数据类型的一致性,NumPy提供了大量的优化函数,能够对数组进行快速的数学运算。相比之下,使用Python原生列表进行相同的运算需要编写循环,效率较低。

例如,计算两个数组的元素之和:

import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
result_np = arr1 + arr2
print(result_np)

输出结果为:[5 7 9]

而使用Python原生列表实现相同的功能:

list1 = [1, 2, 3]
list2 = [4, 5, 6]
result_list = []
for i in range(len(list1)):result_list.append(list1[i] + list2[i])
print(result_list)

输出结果为:[5, 7, 9]

可以看到,使用NumPy数组的代码更加简洁,且在处理大规模数据时,运算效率会更高。

That’s all, thanks for reading!
觉得有用就点个赞、收进收藏夹吧!关注我,获取更多干货~

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

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

相关文章

定时器的设计

定时器 定时器原理如何理解定时器定时器数据结构选取定时器触发方式 定时器的实现 定时器原理 如何理解定时器 定时器在日常通常被描述为组织大量延时任务的模块&#xff0c;其实从字面意思去理解的话&#xff0c;他就是去处理延时任务的&#xff0c;那么什么是延时任务呢&am…

大模型-分布式论文一瞥

1分离式架构 1.1 DistServe DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving 讲的是一个将prefill和decoding分…

02.SpringBoot常用Utils工具类详解

文章目录 1. BeanUtils详解1.1 什么是BeanUtils&#xff1f;1.2 主要的BeanUtils实现1.2.1 Spring BeanUtils1.2.2 Apache Commons BeanUtils1.2.3 其他实现 1.3 Spring BeanUtils详细使用1.3.1 基本用法1.3.2 指定忽略属性1.3.3 批量拷贝&#xff08;列表转换&#xff09; 1.4…

Golang快速开发框架——项目立项与系统配置读取组件viper(一)

Golang快速开发框架——项目立项与系统配置读取组件viper&#xff08;一&#xff09; 背景 知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录&#xff0c;将其整理出来以文章的形式分享给大家&#xff0c;来进行共同学习。欢迎大家进行持续关注。 知识分…

打造可观测的 iOS CICD 流程:调试、追踪与质量保障全记录

随着iOS项目复杂度增加&#xff0c;团队越来越依赖自动化构建、自动化测试等CI/CD流程来保证产品质量。但CI/CD环境下&#xff0c;很多线下调试手段无法直接使用&#xff0c;比如&#xff1a; 无法手动连真机跑Instruments测试包只在分发后才能拿到崩溃模拟器上表现和真机不一…

C++11中 <cinttypes>的入门与精通

文章目录 一、<cinttypes> 是什么1. 固定宽度的整数类型2. 整数操作函数3. 格式化输入输出宏 二、深入理解 <cinttypes>1. 固定宽度整数类型的使用2. 整数操作函数的使用3. 格式化输入输出宏的使用 三、实践和技巧1. 使用固定宽度整数类型的最佳实践2. 使用整数操作…

Pytorhc Lightning进阶:一篇实例玩转Pytorhc Lightning 让训练更高效

Pytorhc Lightning进阶&#xff1a;一篇实例玩转Pytorhc Lightning 让训练更高效 Pytorhc Lightning 主要包含以下几大类&#xff0c;主要围绕以下讲解&#xff1a; 模型&#xff0c;PyTorch Lightning 的核心是继承 pl.LightningModule数据&#xff0c;数据模块继承pl.Light…

大模型算法面试笔记——注意力Transformer流程/面试题篇

学习资料来源于字母站大学 1 Transformer架构 基于编码器-解码器的架构来处理序列对。跟使用注意力的seq2seq不同&#xff0c;Transformer是基于纯注意力。 2 注意力 2.1 自注意力机制 使用注意力&#xff1a;需要根据整个序列进行预测&#xff0c;对于同一input&#xf…

Rust 定义与实例化结构体

文章目录 Rust 定义与实例化结构体5.1 结构体的定义与意义5.2 结构体实例化5.2.1 基本实例化5.2.2 可变性规则5.2.3 字段初始化简写5.2.4 结构体更新语法 5.3 特殊结构体类型5.3.1 元组结构体&#xff08;Tuple Struct&#xff09;5.3.2 类单元结构体&#xff08;Unit-Like Str…

ELK日志分析系统(filebeat+logstash+elasticsearch+kibana)

一、ELK 平台介绍 1、ELK 概述 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷&#xff0c;性能安全性&#xff0c;从而及时采取措施纠正错误。…

JS基础4—jQuery

jQuery常用内容 jQuery 介绍jQuery 获取方式基本选择器 (最常用)层级选择器 (基于元素间关系)过滤选择器 (基于特定条件) jQuery事件绑定jQuery 方法调用jQuery遍历jQuery 获取与设置jQuery 添加与删除jQuery CSS 类jQuery - AJAX 总结 jQuery 介绍 jQuery 是一个轻量级、快速…

时钟周期是什么?

时钟周期&#xff08;Clock Cycle&#xff09;是什么&#xff1f; 时钟周期&#xff08;Clock Cycle&#xff09;是计算机系统中一个最基础的时间单位&#xff0c;也称为时钟节拍或时钟周期时间&#xff08;Clock Period&#xff09;。它由系统时钟发生器产生的一个周期性脉冲…

如何用SEO优化长尾关键词?

内容概要 在SEO优化领域&#xff0c;长尾关键词扮演着至关重要的角色&#xff0c;它们能有效提升网站在搜索引擎中的可见度和流量转化率。本文将全面解析如何通过系统方法优化长尾关键词&#xff0c;涵盖从基础理论到实战应用的完整流程。核心内容包括利用专业工具进行关键词挖…

电子面单系统开发全解析

一、如果要做电子面单系统&#xff0c;怎么做&#xff1f; 开发电子面单系统是一项复杂且涉及多方面考量的工程&#xff0c;涵盖需求分析、系统架构设计、技术选型、接口对接、安全性保障、第三方服务选择以及部署与维护等关键环节。 电子面单系统开发步骤 需求分析&#xf…

UE5 - 制作《塞尔达传说》中林克的技能 - 18 - 磁力抓取器

让我们继续《塞尔达传说》中林克技能的制作!!! UE版本:5.6.0 VS版本:2022 本章节的核心目标:磁力抓取器 先让我们看一下完成后的效果: 18_磁力抓取器 大纲如下: 引言功能架构与核心逻辑物理材质与场景配置代码实现:从识别到操控操作说明1.引言 在《塞尔达传说》中,林…

基于ApachePOI实现百度POI分类快速导入PostgreSQL数据库实战

目录 前言 一、百度POI分类简介 1、数据表格 2、分类结构 二、从Excel导入到PG数据库 1、Excel解析流程 2、数据入库 3、入库成果及检索 三、总结 前言 在上一篇博文中&#xff0c;我们对高德POI分类进行了深入剖析 并对Excel 中 POI 分类数据的存储结构特点进行了详细介…

学习经验分享【41】YOLOv13:基于超图增强自适应视觉感知的实时目标检测

YOLO算法更新速度很快&#xff0c;已经出到V13版本&#xff0c;后续大家有想发论文或者搞项目可更新自己的baseline了。 摘要&#xff1a;YOLO 系列模型凭借其卓越的精度和计算效率&#xff0c;在实时目标检测领域占据主导地位。然而&#xff0c;YOLOv11 及早期版本的卷积架构&…

Handling outliers in non-blind image deconvolution论文阅读

Handling outliers in non-blind image deconvolution 1. 研究目标与实际意义2. 创新方法:基于EM的异常值建模2.1 新模糊模型2.1.1 目标函数2.2 EM框架:迭代优化二元掩码2.2.1 E步:计算后验权重 E [ m x ] E[m_x] E[mx​]2.2.2 M步:加权正则化反卷积2.3 优化加速技术2.3.1…

Redis 功能扩展:Lua 脚本对 Redis 的扩展

Redis 是一个高性能的内存数据库&#xff0c;支持多种数据结构&#xff0c;如字符串、哈希、列表、集合和有序集合。为了增强其功能&#xff0c;Redis 引入了 Lua 脚本支持&#xff0c;使开发者可以编写自定义的脚本&#xff0c;确保操作的原子性并提高复杂操作的性能。本文将详…

七天学完十大机器学习经典算法-06.支持向量机(SVM):分类边界的艺术——深入浅出指南

接上一篇《七天学完十大机器学习经典算法-05.从投票到分类&#xff1a;K近邻(KNN)算法完全指南》 想象你要在操场上为两个班级划活动区域&#xff0c;如何画出一条最公平的分界线&#xff1f;这条线不仅要分开两班学生&#xff0c;还要让两个班都离分界线尽可能远——这就是支持…