Python 多维数组详解(numpy)

文章目录

  • 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 npa = 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 npa = 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 npa = 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 npa = 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 npa = 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 npa = 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 npa = 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.hqwc.cn/news/288751.html

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

相关文章

飞天使-k8s知识点1-kubernetes架构简述

文章目录 名词功能要点 k8s核心要素CNCF 云原生框架简介k8s组建介绍 名词 CI 持续集成, 自动化构建和测试&#xff1a;通过使用自动化构建工具和自动化测试套件&#xff0c;持续集成可以帮助开发人员自动构建和测试他们的代码。这样可以快速检测到潜在的问题&#xff0c;并及早…

【QT】解决QTableView修改合并单元格内容无法修改到合并范围内的单元格

问题:修改合并单元格的内容 修改合并单元格的内容时,希望直接修改到合并范围内的单元格,Qt没有实现这个功能,需要自己写出 Delegate来实现 方案:Delegate class EditDelegate : public QStyledItemDelegate {public:EditDelegate(QTableView *view): tableView(view){}pu…

位操作符详解(C语言)

前言 C语言中的位操作符是用来对数据的二进制表示进行位级操作的运算符。这些操作符包括位与&#xff08;&&#xff09;、位或&#xff08;|&#xff09;、位异或&#xff08;^&#xff09;、位取反&#xff08;~&#xff09;&#xff0c;这些位操作符可以用来进行各种位级…

华为选择“力图生存”!国家队正式出手,外媒:鸿蒙将全面爆发

引言 在国际舞台上&#xff0c;国与国之间的关系错综复杂&#xff0c;舆论的力量也十分重要。近日&#xff0c;关于华为鸿蒙系统失去用户的预测成为热议的话题。这背后所面对的挑战和对抗也异常严峻。本文将解释鸿蒙系统的崛起与前景展望&#xff0c;揭示其中的机遇与挑战。 …

9ACL访问控制列表

为什么要有访问控制&#xff08;Access Control List&#xff09;&#xff1f; 因为我可能在局域网中提供了一些服务&#xff0c;我只希望合法的用户可以访问&#xff0c;其他非授权用户不能访问。 原理比较简单&#xff0c;通过对数据包里的信息做过滤&#xff0c;实现访问控…

《每天一分钟学习C语言·三》

1、 scanf的返回值由后面的参数决定scanf(“%d%d”,& a, &b); 如果a和b都被成功读入&#xff0c;那么scanf的返回值就是2如果只有a被成功读入&#xff0c;返回值为1如果a和b都未被成功读入&#xff0c;返回值为0 如果遇到错误或遇到end of file&#xff0c;返回值为EOF…

华清远见作业第十三天

1.使用多文件编辑&#xff0c; 定义商品信息:商品名称&#xff0c;商品单价&#xff0c;商品购买个数&#xff0c;商品描述&#xff0c;循环输入购买的商品&#xff0c;按单价排序&#xff0c;输出商品信息&#xff0c;计算最贵的商品以及一共花了多少钱? 在create函数&#x…

【科技前沿】数字孪生技术改革智慧供热,换热站3D可视化引领未来

换热站作为供热系统不可或缺的一部分&#xff0c;其能源消耗对城市环保至关重要。在双碳目标下&#xff0c;供热企业可通过搭建智慧供热系统&#xff0c;实现供热方式的低碳、高效、智能化&#xff0c;从而减少碳排放和能源浪费。通过应用物联网、大数据等高新技术&#xff0c;…

C : DS二叉排序树之删除

Description 给出一个数据序列&#xff0c;建立二叉排序树&#xff0c;并实现删除功能 对二叉排序树进行中序遍历&#xff0c;可以得到有序的数据序列 Input 第一行输入t&#xff0c;表示有t个数据序列 第二行输入n&#xff0c;表示首个序列包含n个数据 第三行输入n个数据…

vue-springboot-java电力员工安全施工培训课程考试管理系统

本电力员工安全施工培训管理系统是为了提高员工查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了员工和管理员这二者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;…

Ubuntu 常用命令之 zip 命令用法介绍

Ubuntu系统下的zip命令是用来压缩文件的。这个命令可以将一个或多个文件或者目录压缩成一个.zip文件&#xff0c;也可以将整个目录树压缩成一个.zip文件。 zip命令的基本格式 zip [选项] [压缩文件名] [要压缩的文件或目录...]zip命令的主要参数有 -r&#xff1a;递归压缩&a…

2023年12月20日雄县采样

刚去的时候&#xff0c;找不着冬小麦地&#xff0c;因为积雪太厚了&#xff0c;小麦都被埋住了。 翻了几波地失败了几个点&#xff0c;也渐渐得出经验了&#xff0c;像下图这种有田垄的大块连成片农田&#xff0c;“高标准”农田。一定是种植小麦的。 刨开土能看到小麦就和挖到…