【NumPy系列】基本操作 - 一

news2025/4/19 19:32:04

知识目录

  • 前言
  • 一、NumPy介绍
    • 1.1 导入NumPy库
    • 1.2 查看NumPy版本
    • 1.3 读取图片返回NumPy数组
  • 二、创建NumPy数组的十二种方式
    • 2.1 array 和 full
    • 2.2 zeros 和 ones
    • 2.3 随机数数组
    • 2.4 服从正态分布的数组
    • 2.5 arrange 和 eye、linspace
  • 三、ndarray属性
  • 四、ndarray基本操作
    • 4.1 索引
    • 4.2 切片
        • 一维数组
        • 二维数组
  • 五、实例 - 图片翻转
  • 六、变形
  • 七、合并与拆分
    • 7.1 合并
    • 7.2 拆分
  • 八、数组拷贝
  • 结语
  • 相关导读

前言

大家好!我是初心,本期给大家带来的是【【NumPy系列】基本操作 - 一。
作者的【 Python 数据分析】专栏正在火热更新中,如果本文对您有帮助,欢迎大家点赞 + 评论 + 收藏 !

每日金句分享:选择你所喜欢的,爱你所选择的。』—— 托尔斯泰「托尔斯泰

一、NumPy介绍

NumPy( Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy主要用于数组计算,包含
一个强大的N维数组对象 ndarray
广播功能函数
整合 C/C++/Fortran 代码的工具
线性代数、傅里叶变换、随机数生成等功能

1.1 导入NumPy库

导入 NumPy 库是我们的第一步准备工作。在此,还一并导入了以后会用到的 Pandas 库、 MatplotLib 库的 pyplot 模块。

# 导入数据分析 ‘三剑客’
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

1.2 查看NumPy版本

# 注意左右都是双下划线 ~ ~
np.__version__

1.3 读取图片返回NumPy数组

通过 pyplot 读取到的图片,返回的就是一个 NumPy 数组。

这是我事先准备好的一张图片 —— tangsan.jpg:

接下来通过 plt 对象读取:

n = plt.imread('pic\\tangsan.jpg')
n

输出过多,这里只展示首尾:



查看数组形状:

n.shape

再次显示图片:

plt.imshow(n)

二、创建NumPy数组的十二种方式

2.1 array 和 full

array 函数用法:numpy.array(object, dtype=None),object 可以为单个值、元组、列表、多维可迭代对象等可迭代对象,作用是创建数组。

list_one = [1,2,3,4]
# 列表创建
n1 = np.array(list_one)
tuple_one = (1,3,2)
# 元组创建
n2 = np.array(tuple_one,dtype=np.int16)
display(n1,n2)

下面是运行结果:

full 函数用法:numpy.full(shape, fill_value, dtype=None),shape 是数组形状(可以理解为几维几列,一般以元组形式给出),fill_value 是填充的值,dtype 是类型,作用是创建一个值全为同一个的数组。

# 创建一个二维三列的数组
n2 = np.full(shape=(2,3),fill_value=1,dtype=np.int16)
n2

2.2 zeros 和 ones

zeros 函数用法:zeros(shape, dtype=float, order=‘C’),返回一个给定形状和类型的用0填充的数组。

n3 = np.zeros((3,3))
n3

ones 函数用法:np.ones(shape, dtype=None, order=‘C’),返回一个指定形状和类型的用1填充的数组。

n4 = np.ones((3,2),dtype=np.float)
n4

2.3 随机数数组

randint 函数用法:randint(low, high=None, size=None, dtype=‘l’),low 为随机数最小值,high 为最大值(取不到),size 在这里等价于 shape ,返回一个指定维度且元素位于 low~high 之间的随机数组。

n5 = np.random.randint(1,10,(3,4))
n5

random 函数用法:random(size),size 等价于 shape ,为行列数,返回一个0~1之间指定形状的数组。

n6 = np.random.random((4,2))
n6

rand 函数用法:rand(d0, d1, …, dn),d0,d1,dn 分别表示1~n个维度的维数,返回一个0-1之间指定维度的数组,区别于 random 的是,这个函数传参不能传入带 ()的元组。

n7 = np.random.rand(3,3)
n7

2.4 服从正态分布的数组

randn() 函数用法:randn(d0, d1, …, dn),创建一个服从标准正态分布(X ~ N(0,1))的多维数组。也就是说,产生的数据大部分生成在0左右。

n8 = np.random.randn(2,3)
n8

normal()函数用法:normal(loc=0.0, scale=1.0, size=None),loc 表示均值,scale 表示标准差,size等价于 shape ,创建一个服从正态分布的多维数组。

n9 = np.random.normal(1,2,(2,3))
n9

2.5 arrange 和 eye、linspace

eye()函数用法:np.eye(N, M=None, k=0, dtype=<class ‘float’>, order=‘C’),N 是行数,M 是列数,K 是偏移量,创建一个单位矩阵数组。

n10 = np.eye(5,5)
n10

linspace()函数用法:np.linspace(start,stop,num),创建一个包含 num 个数的等差数列,公差 d 等于多少由系统计算。

n11 = np.linspace(1,20,3)
n11

arrange()函数用法:arange([start,] stop[, step,], dtype=None),start 为起始数,stop 为结束数,创建一个连续的一维数组。

n12 = np.arange(1,10,dtype=np.int16)
n12

三、ndarray属性

维度:ndim ,直接返回维度数
形状:shape,数字有几个就表示几维数组
总长度:size,返回总数据量
元素类型:dtype

n1 = np.random.randint(1,10,(3,5))
display(n1)
print("维度:%d,形状:%s,总长度:%s,元素类型:%s"%(n1.ndim,n1.shape,n1.size,n1.dtype))

四、ndarray基本操作

4.1 索引

在 ndarray 数组中,索引的使用有两种等价方式,即 n [M,N] = n [M][N],M表示第一个维度,N表示第二个维度,若不止二维,以此类推,n[M,N,P,……]。

n1 = np.random.randint(1,10,(3,5))
print(n1)
print("n1[2,3]=%s,n1[2][3]=%s"%(n1[2,3],n1[2][3]))

4.2 切片

切片包括行、列切片,可以实现取连续或不连续的行或列,也可以复制、翻转数组,如果是:, 的写法,表示第一个维度全取,并且,切片操作都是左闭右开。

一维数组

  • <1> 一个参数:a[i],返回一个数
  • <2> 两个参数:a[start:stop],对数组进行切片
  • <3>三个参数:a[start,stop,step],对数组进行切片,step 为步长,当 step = -1 时表示翻转。

二维数组

  • <1> 取元素:a[i,j],返回第 i 行的第 j 个数
  • <2> 切片:a[xi:xj,yi:yj],返回第 xi ~ xj 行的第 yi ~ yj 列,两个维度都是左闭右开。
  • <3> 切片特殊情况:左边从0开始可以省略,右边到结尾可以省略,即 X[:e0,s1:e1] ,表示第1维从第1行开始到第 e0 行;X[s0:,s1:e1],表示从第 s0 行到最后一行。

常用的切片操作如下所示(以二维数组为例,n1 数组就是4.1索引中创建的),具体运行结果,这里不再展示。

print(n1[1:]) # 行切片,取第二行到最后一行
print(n1[:,2:]) # 列切片,取第三列到最后一列
print(n1[:]) # 复制数组
print(n1[[0,2]]) # 取不连续的行,用两个括号
print(n1[:,[0,2]])# 取不连续的列
print(n1[::-1]) # 行翻转
print(n1[:,::-1]) # 列翻转
print(n1[::-1,::-1]) # 行列都翻转

如果对某些切片操作有疑问,欢迎大家联系我,文末附联系方式,我看到后一定会第一时间为大家解答的。

五、实例 - 图片翻转

我们依旧采用 1.3 中的 tangsan.jpg 图片,通过对 ndarray 数据切片实现图片翻转效果,这里只展示上下翻转的效果,大家也可以换图片尝试。

# 读取图片
nd = plt.imread('pic/tangsan.jpg')
# 显示原图
plt.imshow(nd)
# 上下翻转,通过改变 nd 数组,将纵轴翻转,也就是横轴逆序实现
plt.imshow(nd[::-1])

plt.imshow(nd[:,::-1]) # 左右翻转

六、变形

通过 reshape 函数,我们可以改变数组的形状,或者说维度,注意改变后需要重新赋值给数组。

首先创建好如下的数组:

n1 = np.array([
    [3,5],
    [4,2],
    [2,3]
])
n1

然后改变形状:

n1.reshape((6,1))

让行或列自适应,通过维数写 - 1 实现:

n1.reshape((2,-1)) # 行数为2,列数自适应
n1.reshape(-1,2) # 列数为2,行数自适应

七、合并与拆分

7.1 合并

concatenate 函数用法:concatenate((a1, a2, …), axis=0, out=None),a1,a2 表示数组,axis 表示轴,值为0表示横向合并,值为1表示纵向合并。

n1 = n1.reshape((2,3))
n2 = np.random.randint(0,10,(2,3))
display(n1,n2)
n3 = np.concatenate((n1,n2),axis=0) # 行合并
n4 = np.concatenate((n1,n2),axis=1) # 列合并
display(n3,n4)

此外,还可以使用 hstack 函数和 vstack 函数单独实现水平合并和垂直合并。相比,concatenate 函数会更方便些。

n2 = np.random.randint(0,10,(2,3))
n1 = np.random.randint(0,10,(2,3))
display(n1,n2)
n3 = np.hstack((n1,n2)) # 水平合并
n4 = np.vstack((n1,n2)) # 垂直合并
display(n3,n4)

7.2 拆分

split 函数用法:np.split(ary, indices_or_sections, axis=0),ary:要切分的数组,indices_or_sections:填入一个整数或者一个可迭代对象,如果是整数,就切分为整数个子数组;如果是可迭代对象,就在该索引位置切分。

将数组进行拆分为多个数组,通过 axis (轴),可以控制水平或垂直拆分,具体请看下面的示例。

n3 = n3.reshape((6,2))
display(n3) # 1.查看 n3 数组
n5 = np.split(n3,2,axis=0) # 横向切分,均分为2部分
n6 = np.split(n3,1,axis=1) # 纵向切分,均分为1部分
print(n5)
print(n6)
n7 = np.split(n3,[1,3],axis=0) # 在索引为 0 和 3 处切分,切分为3部分
print(n7)

运行结果:

和合并一样,也有单独进行水平拆分和垂直拆分的方法,分别是:hsplit 和 vsplit ,函数用法参数都是 np.hsplit(ary, indices_or_sections) ,具体用法这里不再展示。

八、数组拷贝

使用 copy 函数创建一个数组的副本。

n4 = np.copy(n3) # 数组拷贝

结语

本期跟大家分享的 “芝士” 就到此结束了,关于 NumPy 的基本操作,你学会了吗?

💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见! ✨
🍻 如果你喜欢的话,就不要吝惜你的一键三连了~ 🍻

如果文中有些地方不清楚的话,欢迎联系我,我会给大家提供思路及解答。

相关导读

文章直达链接
上期回顾【数据分析 - 基础入门之NumPy③】- 日常难疑解决
下期预告【数据分析 - 基础入门之NumPy⑤】- NumPy基本操作 - 二

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

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

相关文章

渗透测试方法论

文章目录 渗透测试方法论1. 渗透测试种类黑盒测试白盒测试脆弱性评估 2. 安全测试方法论2.1 OWASP TOP 102.3 CWE2.4 CVE 3. 渗透测试流程3.1 通用渗透测试框架3.1.1 范围界定3.1.2 信息搜集3.1.3 目标识别3.1.4 服务枚举3.1.5 漏洞映射3.1.6 社会工程学3.1.7 漏洞利用3.1.8 权…

TCP可靠性机制

确认号/序列号/ACK TCP帮助确保数据的准确传递。为了做到这一点&#xff0c;其使用了一些特殊的标记和信息&#xff0c;其中包括序号、确认号和ACK字段。 其中&#xff0c;它将每个字节的数据都进行了编号. 即为序列号. 序列号&#xff1a;就像给书中的每一页都编了号码一样&a…

【核磁共振成像】傅里叶重建

目录 一、傅里叶重建二、填零三、移相四、数据窗函数五、矩形视野六、多线圈数据重建七、图像变形校正八、缩放比例九、基线校准 长TR&#xff0c;长TE&#xff0c;是T2加权像&#xff1b; 短TR&#xff0c;短TE&#xff0c;是T1加权像&#xff1b; 长TR&#xff0c;短TE&#…

关于vlan的三层架构实验

实验要求及拓扑 一、思路 1. 先配置接入层的接口类型及划分 2.配置汇聚层的接口类型及划分 3.配置汇聚层的IP地址及编写缺省、NAT--IP地址转换 4. 给vlan分组&#xff0c;定义组 的主根&#xff0c;组的备份根 5.汇聚层之间使用通道技术(华为&#xff1a;以太网中继Eth-Tru…

在线设计APP ui的网站,分享这7款

在数字时代&#xff0c;用户界面&#xff08;UI&#xff09;设计变得非常重要&#xff0c;因为良好的UI设计可以改善用户体验&#xff0c;增强产品吸引力。随着科学技术的发展&#xff0c;越来越多的应用在线设计网站出现&#xff0c;为设计师和团队提供了一种新的创作方式。本…

浅谈泛在电力物联网在电力设备状态在线监测中的应用

安科瑞 华楠 摘要&#xff1a;随着信息化水平的不断发展&#xff0c;泛在电力物联网的建设提上日程&#xff0c;这对提升变电站电力设备在线监测水平&#xff0c;推动智能电网发展具有重要的指导意义。对基于物联网的电力设备状态监测系统进行了研究&#xff0c;概括了泛在电力…

⏰⏰⏰⏰⏰⏰⏰⏰K8s常用指令集锦

1、常用基础命令 kubectl top pod -n wsmp kubectl get pod # 获取namespace下的所有podkubectl get pods -o wide # 获取 pod 详细信息 kubectl describe po ${podName} # 获得pod的状态kubectl get po ${podName} -o yaml # yaml 看不惯的话&#xff0c;也可以…

NPM 管理组织成员

目录 1、向组织添加成员 1.1 邀请成员加入您的组织 1.2 撤销组织邀请 2、接收或拒接组织邀请 2.1 接收组织邀请 2.2 拒绝组织邀请 3、组织角色和权限 4、管理组织权限 5、从组织中删除成员 1、向组织添加成员 作为组织所有者&#xff0c;您可以将其他npm用户添加到…

gRpc的四种通信方式详细介绍

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

python+selenium的web自动化之针对上传操作的实现方案

一、关于上传操作 ​ 上传有两种情况&#xff1a; 如果是input可以直接输入路径的&#xff0c;那么直接使用send_keys(文件路径)输入路径即可&#xff1b; 非input标签的上传&#xff0c;则需要借助第三方工具&#xff1a;第三方库 pywin32、第三方工具pyautogui等等。 ​ 那…

揭开路由协议隐藏的风险

路由协议在互联网和基于其的服务的运行中发挥着至关重要的作用。然而&#xff0c;许多这些协议的开发都没有考虑到安全问题。 例如&#xff0c;边界网关协议 (BGP) 最初并未考虑对等点之间发生攻击的可能性。过去几十年来&#xff0c;BGP 中的起源和路径验证已投入了大量工作。…

JUC--阻塞队列

目录 问题引出 一.单端阻塞队列&#xff08;BlockingQueue&#xff09; 二.双端阻塞队列&#xff08;BlockingDeque&#xff09; 三.延迟队列&#xff08;DelayQueue&#xff09; 问题引出 由于实现消费者-生产者模型&#xff0c;每一次实现都比较麻烦&#xff0c;比如sych…

2023河南萌新联赛第(六)场:河南理工大学 B - 这是dp题吗

2023河南萌新联赛第&#xff08;六&#xff09;场&#xff1a;河南理工大学 B - 这是dp题吗 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 小l同学非常喜欢三角形&#x…

淘宝商品优惠券详情item_get_app-获得淘宝app商品详情原数据

item_get_app-获得淘宝app商品详情原数据 taobao.item_get_app 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;调用API接口入口secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09…

等级发布/查询平台

在传统的教学模式下&#xff0c;老师们需要手动把成绩挨个私发给学生家长&#xff0c;这不仅费时费力&#xff0c;还容易出现错误。然而&#xff0c;随着科技的不断发展&#xff0c;易查分系统的出现为教师提供了一个高效准确的成绩发布工具。 系统优势 1. 高效便捷&#xff1a…

【数据结构与算法】弗洛伊德算法

弗洛伊德算法 介绍 和 Dijkstra 算法一样&#xff0c;弗洛伊德&#xff08;Floyd&#xff09;算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。弗洛伊德算法计算图中各个顶点之间的最短路径。迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。弗洛伊德算…

贪吃蛇大作战技术报告(JAVA)

完整作品见链接&#xff1a;JAVA贪吃蛇大作战大作业_Java贪吃蛇如何实现向左不能向右资源-CSDN文库 猫猫大作战技术报告 1、项目概述 本项目的编译环境为jdk-19&#xff0c;用到的编译器为Eclipse&#xff0c;采用图形化编程&#xff0c;基于JAVA的Swing库进行界面的绘制&…

解决Pandas KeyError: “None of [Index([...])] are in the [columns]“问题

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

使用ctcloss训练矩阵生成目标字符串

首先我们需要明确 c t c l o s s ctcloss ctcloss是用来做什么的。比如说我们要生成的目标字符串长度为 l l l&#xff0c;而这个字符串包含 k k k个字符&#xff0c;字符串允许的最大长度为 L L L&#xff0c;这里我们认为一个位置是一个时间步&#xff0c;就是一拍&#xff0…

PyTorch三种主流模型构建方式:nn.Sequential、nn.Module子类、nn.Module容器开发实践,以真实烟雾识别场景数据为例

Keras和PyTorch是两个常用的深度学习框架&#xff0c;它们都提供了用于构建和训练神经网络的高级API。 Keras: Keras是一个高级神经网络API&#xff0c;可以在多个底层深度学习框架上运行&#xff0c;如TensorFlow和CNTK。以下是Keras的特点和优点&#xff1a; 优点&#xff…