Python 多维数组详解(numpy)

news2024/9/23 11:27:54

文章目录

  • 1 概述
    • 1.1 numpy 简介
    • 1.2 ndarray 简介
  • 2 数组操作
    • 2.1 创建数组:array()
    • 2.2 裁切数组:切片
    • 2.3 拼接数组:concatenate()
    • 2.4 拆分数组:array_split()
    • 2.5 改变数组形状:reshape()
  • 3 元素操作
    • 3.1 获取元素:通过索引
    • 3.2 获取元素:通过迭代器 nditer()
    • 3.3 获取元素及索引:ndenumerate()
    • 3.4 搜索元素:where()
    • 3.5 元素排序:sort()
    • 3.6 元素过滤:过滤器
    • 3.7 行列互换:transponse()
  • 4 扩展
    • 4.1 元素类型:dtype
    • 4.2 数组属性

1 概述

1.1 numpy 简介

  • numpy:Numerical Python(数值表示的 Python),支持大量的维度数组与矩阵运算,此外也提供了大量的数学函数库。
  • 底层算法:使用了 C 语言,所以运算速度快。

安装 numpy:(第三方库)

pip install numpy

示例:

import numpy as np

a = np.array([1, 2, 3])
print(a)  # [1 2 3]

# 返回值类型 ndarray
print(type(a))  # <class 'numpy.ndarray'>

1.2 ndarray 简介

ndarray 主要有以下特点

  • 元素索引:元素下标从 0 开始。
  • 元素类型:元素类型完全相同。(若元素类型不同,按优先级 str > float > int 自动转换)
  • 内存空间:元素所占内存空间一样大。
import numpy as np

# 示例:一维数组
a = np.array([1, 2, 3])

# 元素索引:从 0 开始
print(f'下标为 0 的元素:{a[0]}')  # 1
print(f'下标为 1 的元素:{a[1]}')  # 2
print(f'下标为 2 的元素:{a[2]}')  # 3

# 元素类型:完全一样
print(f'下标为 0 的元素类型:{a[0].dtype}')  # int32
print(f'下标为 1 的元素类型:{a[1].dtype}')  # int32
print(f'下标为 2 的元素类型:{a[2].dtype}')  # int32

# 元素内存空间:完全一样
print(f'下标为 0 的元素内存空间:{a[0].itemsize}')  # 4
print(f'下标为 1 的元素内存空间:{a[1].itemsize}')  # 4
print(f'下标为 2 的元素内存空间:{a[2].itemsize}')  # 4

元素类型转换示例:

import numpy as np

# 示例:一维数组
# 1 和 2 是 int, 3.5 是 float
a = np.array([1, 2, 3.5])

print(a)  # [1.  2.  3.5]
print(f'下标为 0 的元素类型:{a[0].dtype}')  # float64
print(f'下标为 1 的元素类型:{a[1].dtype}')  # float64
print(f'下标为 2 的元素类型:{a[2].dtype}')  # float64

2 数组操作

2.1 创建数组:array()

语法格式:

numpy.array(object,  # 数组的输入数据。可以是列表、元组、数组等
            dtype=None,  # 生成数组的数据类型
            copy=True,  # 是否复制
            order=None,  # 是否排序(内存,C:按行方向,F:按列方向,A:任意方向,k:默认数据输入时方向)
            subok=False,  # 是否返回子类数组
            ndmin=0  # 生成数组的维度
            )

#  重点关注:dtype、ndmin
#  copy、order、subok 了解即可,与内存存储相关,一般不使用
import numpy as np

# 创建一维数组
a = np.array([1, 2, 3])
print(a)

# 创建二维数组
b = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
print(b)

# 创建结构化数据的数组
student = np.dtype([('name', 'S10'), ('age', 'i1'), ('sex', 'f4')])
c = np.array([('张三', 21, '女'), ('李四', 18, '男')])
print(c)
# [['张三' '21' '女']
#  ['李四' '18' '男']]


# 其它内置创建数组的函数,此处仅举例部分
# 示例:创建给定数组范围的数组:arange()
d = np.arange(start=1,  # 起点(默认 0)
              stop=5,  # 终点(不包含)
              step=1,  # 步长(默认 1)
              dtype=np.int_  # 返回数据的类类型(自动判断)
              )
print(d)  # [1 2 3 4]

2.2 裁切数组:切片

  • 同字符串的 切片
  • [start: end: step]
    • start:起点索引,包含
    • end:终点索引,不包含,默认所有
    • step:步长,默认 1
import numpy as np

# 示例1:一维数组
a = np.array([1, 2, 3, 4, 5])

# 裁切 索引1 到 索引4 的元素,步长为 1
print(a[1:4:1])  # [2 3 4]
# 裁切 索引1 到 结尾的元素,步长为 2
print(a[1::2])  # [2 4]

# 示例2:二维数组
b = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# 裁切 横索引1、纵索引1:3 的元素
print(b[1, 1:3])  # [5 6]

2.3 拼接数组:concatenate()

import numpy as np

# 示例1:连接一维数组
a1 = np.array([1, 2, 3])
a2 = np.array([4, 5, 6])
a = np.concatenate((a1, a2))
print(a)  # [1 2 3 4 5 6]

# 示例2:沿着对称轴(axis=1)连接二维数组
b1 = np.array([[1, 2],
               [3, 4]])
b2 = np.array([[5, 6],
               [7, 8]])
print(np.concatenate((b1, b2), axis=1))
# [[1 2 5 6]
#  [3 4 7 8]]

2.4 拆分数组:array_split()

import numpy as np

# 示例1:一维数组
a = np.array([1, 2, 3, 4, 5, 6])
new_a = np.array_split(a, 3)
print(new_a)
# [array([1, 2]), array([3, 4]), array([5, 6])]

# 示例2:二维数组
b = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
new_b = np.array_split(b, 2)
print(new_b)
# [array([[1, 2, 3],
#        [4, 5, 6]]), array([[7, 8, 9]])]

print(np.array_split(b, 2, axis=1))  # 沿对称轴拆分
# [array([[1, 2],
#        [4, 5],
#        [7, 8]]), array([[3],
#        [6],
#        [9]])]

2.5 改变数组形状:reshape()

import numpy as np

a = np.arange(12)

print(a)
# [ 0  1  2  3  4  5  6  7  8  9 10 11]

# 示例:由原 一维数组 变为 二维数组(3行4列)
b = a.reshape((3, 4))
print(b)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

3 元素操作

3.1 获取元素:通过索引

import numpy as np

# 一维数组
a = np.array([1, 2, 3])
print(f'获取下标索引为 0 的元素:{a[0]}')  # 1
print(f'获取下标索引为 1 的元素:{a[1]}')  # 2
print(f'获取下标索引为 2 的元素:{a[2]}')  # 4

# 二维数组
b = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
print(f'获取下标索引为 0,0 的元素:{b[0][0]}')  # 1。写法1
print(f'获取下标索引为 1,0 的元素:{b[1, 0]}')  # 4。写法2

在这里插入图片描述

3.2 获取元素:通过迭代器 nditer()

import numpy as np

# 示例1:一维数组
a = np.array([1, 2, 3, 4, 5, 6])

for x in np.nditer(a):
    print(x, end=", ")  # 1, 2, 3, 4, 5, 6, 

print()
# 示例2:二维数组
b = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

for x in np.nditer(b):
    print(x, end=", ")  # 1, 2, 3, 4, 5, 6, 7, 8, 9, 

3.3 获取元素及索引:ndenumerate()

import numpy as np

# 示例1:一维数组
a = np.array([1, 2, 3, 4, 5, 6])

for idx, x in np.ndenumerate(a):
    print(idx, x, end=", ")
# (0,) 1, (1,) 2, (2,) 3, (3,) 4, (4,) 5, (5,) 6,

print()
# 示例2:二维数组
b = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

for idx, x in np.ndenumerate(b):
    print(idx, x, end=", ")
# (0, 0) 1, (0, 1) 2, (0, 2) 3, 
# (1, 0) 4, (1, 1) 5, (1, 2) 6, 
# (2, 0) 7, (2, 1) 8, (2, 2) 9,

3.4 搜索元素:where()

import numpy as np

a = np.array([0, 1, 2, 3, 3, 5])
x = np.where(a == 3)
print(f'出现元素 3 的索引:{x}')  # (array([3, 4], dtype=int32),)
print(f'元素值为偶数的索引;{np.where(a%2 == 0)}')  # (array([0, 2], dtype=int32),)

3.5 元素排序:sort()

import numpy as np

a = np.array([0, 1, 2, 4, 3, 5])
b = np.sort(a)  # b 是 a 的副本,不影响 a 的元素
print(b)  # [0 1 2 3 4 5]

3.6 元素过滤:过滤器

import numpy as np

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

# 过滤器:仅保留 >= 3 的元素
filter_a = a >= 3
new_a = a[filter_a]
print(new_a)  # [4 3 5]

3.7 行列互换:transponse()

import numpy as np

a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

b = np.transpose(a)
print(b)
# [[ 0  4  8]
#  [ 1  5  9]
#  [ 2  6 10]
#  [ 3  7 11]]

# 利用属性,效果同上
c = a.T
print(c)

4 扩展

4.1 元素类型:dtype

类型字符代码描述
bool_b布尔型(True、False)
int_i整数(默认,类似 C 语言中的 long、int32 或 int64)
intc与 C 的 int 类型一样,一般是 int32 或 int64
intp用于索引的整数(类似 C 语言中的 ssize_t,一般是 int32 或 int64)
int8i1字节数( − 2 7 -2^7 27 to 2 7 − 1 2^7-1 271
int16i2字节数( − 2 15 -2^{15} 215 to 2 15 − 1 2^{15}-1 2151
int32i4字节数( − 2 31 -2^{31} 231 to 2 31 − 1 2^{31}-1 2311
int64i8字节数( − 2 63 -2^{63} 263 to 2 63 − 1 2^{63}-1 2631
uint8u1无符号整数( 0 0 0 to 2 8 − 1 2^{8}-1 281
uint16u2无符号整数( 0 0 0 to 2 16 − 1 2^{16}-1 2161
uint32u4无符号整数( 0 0 0 to 2 32 − 1 2^{32}-1 2321
uint64u8无符号整数( 0 0 0 to 2 64 − 1 2^{64}-1 2641
float_float64 类型的简写
float16f2半精度浮点数。1个符号位,5个指数位,10个尾数位
float32f4单精度浮点数。1个符号位,8个指数位,23个尾数位
float64f8双精度浮点数。1个符号位,11个指数位,52个尾数位
complex_complex 128 类型的简写
complex64c8复数,表示双 32 位浮点数
complex128c16复数,表示双 64 位浮点数
string_S固定长度字符串,如:S10,长度为 10
objectOPython 对象类型

4.2 数组属性

import numpy as np

a = np.array([1, 2, 3])
print(a)  # [1 2 3]
print(f'维度数量 ndim={a.ndim}')
print(f'元素总数 size={a.size}')
print(f'元素形状 shape={a.shape}')  # 行 * 列 = 总数
print(f'元素类型 dtype={a.dtype}')
print(f'元素大小 itemsize={a.itemsize}')  # 单位:字节
print(f'内存标志 flags={a.flags}')
print(f'元素实部 real={a.real}')
print(f'元素虚部 imag={a.imag}')
print(f'元素缓冲 data={a.data}')

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

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

相关文章

uint29传输格式

前言 不知道谁想出来的。 反正我是想不到。 我看网上也没人讲这个。 写篇博客帮一下素未谋面的网友。 uint29 本质上是网络传输的时候&#xff0c;借用至多4字节Bytes&#xff0c;表达29位的无符号整数。 读8位数字&#xff0c;判断小于128? 是的话&#xff0c;返回末7位…

一文读懂PMP项目管理

PMP项目管理是什么 PMP&#xff08;Project Management Professional&#xff09;指项目管理专业人员资格认证&#xff0c;由美国项目管理协会&#xff08;Project Management Institute&#xff0c;简称PMI&#xff09;发起&#xff0c;目前已在全球206个国家和地区进行认证&…

Axure中继器的基本使用

介绍中继器 在 Axure 中&#xff0c;中继器是一种交互设计元素&#xff0c;用于在不同页面之间传递数据或触发特定的事件。它可以帮助模拟真实的用户交互流程和页面之间的传递逻辑&#xff0c;继承关系用于描述两个元件之间的父子关系。通过使用继承关系&#xff0c;您可以创建…

实现高效、透明、公正的采购寻源——鸿鹄电子招投标系统

在数字化时代&#xff0c;企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台&#xff0c;涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等…

如何将图片转为PDF

问题描述&#xff1a;如何将图片转为PDF&#xff0c;有时需要将纸质文档扫描成PDF&#xff0c;然后上传到网上。 解决办法&#xff1a;平时使用的方法是将图片插入到word文件中&#xff0c;然后将图片设置为浮于文字下方&#xff0c;然后调整图片的大小&#xff0c;铺满整个wo…

米家APP如何转让家庭创建者里面设备所有权

环境&#xff1a; 米家APPv8.11.203 问题描述&#xff1a; 米家APP如何转让家庭创建者里面设备所有权&#xff0c;需要添加到HA里面 解决方案&#xff1a; 1.登入创建者账户先把家庭共享给要转让得账户&#xff0c;权限选中管理员 2.登入要转入账户&#xff0c;先加入创建者…

深入学习《大学计算机》系列之第1章 1.4节——从二进制起源窥见的奥秘

一.欢迎来到我的酒馆 第1章 1.4节&#xff0c;从二进制起源窥见的奥秘。 目录 一.欢迎来到我的酒馆二.二进制的起源1.关于莱布尼茨2.莱布尼茨和牛顿的恩怨情仇 二.二进制的起源 本节内容属于知识拓展&#xff0c;通过讲解几个小故事&#xff0c;向大家介绍二进制的起源。 1.关…

为你自己学laravel - 15 - model的更新和删除

为你自己学laravel。 model的部分。 这一次讲解的是model当中怎么从数据库当中更新数据和删除数据。 先从数据库当中抓出来资料。 当然我们是使用php artisan tinker进入到终端机。 我们的做法是想要将available这个栏位修改成为true。 第一种更新方法 上面我们就是修改了对…

OpenHarmony开发环境快速搭建(无需命令行)

一. 搭建Windows环境 在嵌入式开发中&#xff0c;很多开发者习惯于使用Windows进行代码的编辑&#xff0c;比如使用Windows的Visual Studio Code进行OpenHarmony代码的开发。但当前阶段&#xff0c;大部分的开发板源码还不支持在Windows环境下进行编译&#xff0c;如Hi3861、H…

金三银四精选面试题系列

Java中有哪几种方式来创建线程执行任务&#xff1f; 1. 继承Thread类 public class ZhouyuThread extends Thread{public static void main(String[] args) {ZhouyuThread thread new ZhouyuThread();thread.start();}Overridepublic void run() {System.out.println("h…

MyBatis进行CRUD中添加数据实现主键回填

文章目录 MyBatis进行CRUD中添加数据实现主键回填1、创建一个mybatis项目2、实现添加数据时主键回填在MyBatisTest.java中添加下面方法在UserMapper.java中添加对应的属性在UserMapper.xml中添加sql语句如下运行结果如下(取消commit方法注释后就不会出现Rolling back回滚进行真…

<长篇文章!!>数据结构与算法的重要知识点与概要总结 ( •̀ ω •́ )✧✧临近考试和查漏补缺的小伙伴看这一篇就都懂啦~

目录 一、数据结构概论二、算法概论三、线性表四、栈五、队列六、串七、多维数组与矩阵八、广义表九、树与二叉树十、图 一、数据结构概论 1、数据元素和数据项 数据由数据元素组成&#xff0c;即数据元素是数据的基本单位&#xff0c;而数据元素又由若干个数据项组成&#xf…

PHP-Xlswriter高性能导出Excel

使用背景 使用传统的PHPExcel导出效率太慢&#xff0c;并且资源占用高&#xff0c;数据量大的情况&#xff0c;会导致服务占用大量的资源&#xff0c;从而导致生产意味&#xff0c;再三思索后&#xff0c;决定使用其他高效率的导出方式 PHP-Xlswriter PHPExcel 因为内存消耗过…

vue中的侦听器和组件之间的通信

目录 一、侦听器 监听基本数据类型&#xff1a; 监听引用数据类型&#xff1a; 计算属性和watch区别&#xff1f; 二、组件通信/传值方式 1.父子组件传值 父组件给子组件传值&#xff1a; &#xff08;1&#xff09;props &#xff08;2&#xff09;provide inject &…

Android定制ROM简介

Android定制ROM简介 这篇文章是为对自定义ROM、AOSP等词汇不太熟悉的技术爱好者和好奇的人写的。我希望通过向您介绍这个世界来开始博客写作。 在我们将注意力转向定制ROM之前&#xff0c;让我们先了解一些基础知识。 什么是操作系统&#xff1f; 维基百科对此的定义简洁而…

Python 常用模块time和datetime

【一】python中表示时间的三种方式 import time# 时间戳 res time.time() print(res, type(res)) # 1703055531.8492236 <class float># 格式化的时间字符串 res time.strftime(%Y-%m-%d %X) print(res, type(res)) # 2023-12-20 14:58:51 <class str># 结构化的…

《数据结构、算法与应用C++语言描述》- 最小赢者树模板的C++实现

赢者树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_30winnerTree 比赛规则 假定有 n 个选手参加一次网球比赛。比赛规则是“突然死亡法”(sudden-death mode)&#xff1a;一名选手只要输掉一场球&#xff0c;就被淘汰。一对一对…

openstack-neutron服务安装

文章目录 网络服务概述概念主机网络 安装并配置控制节点先决条件完成下面的步骤以创建数据库&#xff1a;用数据库连接客户端以 root 用户连接到数据库服务器&#xff1a;创建 neutron 数据库:对neutron 数据库授予合适的访问权限&#xff0c;使用合适的密码替换NEUTRON_DBPASS…

Tomcat为什么要重写类加载器?

文章目录 一、双亲委派机制二、分析1、Tomcat需要隔离性2、Tomcat需要热替换3、打破双亲委派机制 三、Tomcat类加载器1、拓展类加载器2、工作原理 四、总结 一、双亲委派机制 首先了解下双亲委派机制&#xff0c;大致过程如下&#xff1a; 简单来说&#xff0c;就是加载class…

FIO测试参数与linux内核IO栈的关联分析-part2

二、FIO工具简介 我们在linux环境中&#xff0c;有一个常见测试SSD性能的工具叫做FIO。FIO (Flexible I/O Tester) 是一个强大的开源I/O基准测试工具&#xff0c;主要用于测试存储设备的性能&#xff0c;包括硬盘、固态硬盘 (SSD)、网络存储系统&#xff08;如NAS和SAN&#x…