Python NumPy 的学习笔记

Python NumPy 的学习笔记

  • 0. 引言
  • 1. 为什么要用 Numpy
  • 2. 创建 Numpy 数组
  • 3. 数组的形状
  • 4. 基础操作
    • 4-1. 数组加法
    • 4-2. 数组的广播
    • 4-3. 数组的索引和切片
    • 4-4. 数组形状变换
    • 4-5. 数组的数学操作
    • 4-6. 布尔索引
    • 4-7. 数组的转置 (Transpose)
    • 4-8. 数组的平迭
      • 4-8-1. flatten()
      • 4-8-2. ravel()
    • 4-9. 数组的排序
      • 4-9-1. sort()
      • 4-9-2. argsort()
    • 4-10. 数组的组合
      • 4-10-1. hstack()
      • 4-10-2. vstack()
      • 4-10-3. concatenate()
      • 4-10-4. append()

0. 引言

Numpy 是 Python 中一个非常强大的库,它让我们可以高效地操作大量的数据。想象一下,如果你有一个超级大的数字列表,而你需要对这些数字进行各种复杂的计算,Numpy 就是你的超级英雄!

1. 为什么要用 Numpy

  • 速度:Numpy 使用了 C 语言的部分代码,这让它运行得非常快。
  • 功能多:Numpy 提供了很多数学函数,让复杂的数学计算变得简单。
  • 省空间:Numpy 使用的是数组(array),比 Python 自带的列表(list)更节省空间。

2. 创建 Numpy 数组

想象一下,你有很多颗糖果要放进不同的盒子里,Numpy 数组就像是那些盒子,而糖果就是数据。这些盒子非常特别,因为它们可以非常快地帮你数出里面有多少颗糖果,甚至还可以快速告诉你哪些盒子的糖果比较甜!

import numpy as np# 创建一个简单的数组
arr = np.array([1, 2, 3])
print(arr)

这就像是你有一个盒子,你把 1、2、3 这三颗糖果放进去。

3. 数组的形状

# 创建一个 2x3 的二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr_2d.shape)  # 输出: (2, 3)

这就像是你有一个大盒子,里面有两个小盒子,每个小盒子里都有三颗糖果。

4. 基础操作

4-1. 数组加法

# 创建两个数组
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])# 数组加法
result = arr1 + arr2
print(result)  # 输出: [5 7 9]

这就像是你有两个盒子,一个盒子里的糖果分别是 1、2、3,另一个是 4、5、6。现在你把它们一一对应加起来,就会得到新的盒子,里面的糖果是 5、7、9。

4-2. 数组的广播

广播是 Numpy 的一个强大功能,它让你可以用不同大小的盒子(数组)进行计算。

# 创建一个数组
arr = np.array([1, 2, 3])# 数组与单个数字的加法
result = arr + 2
print(result)  # 输出: [3 4 5]

这就像是你有一个盒子里的糖果分别是 1、2、3,现在你决定每颗糖果都再加两颗糖果,那么盒子里的糖果就变成了 3、4、5。

再举一个示例,

# 创建一个数组
arr = np.array([1, 2, 3])# 用一个小盒子(单个值)与大盒子(数组)进行计算
print(arr * 2)  # 输出: [2 4 6]

这就像是你决定每颗糖果都变成双倍大!

4-3. 数组的索引和切片

想象一下,你的糖果盒子里分了很多格,每一格都有一个编号。你可以很容易地找到任何一格里的糖果,也可以取出一部分糖果来品尝。

# 创建一个一维数组
arr = np.array([10, 20, 30, 40, 50])# 索引:获取第三个元素
print(arr[2])  # 输出: 30# 切片:获取第二到第四个元素
print(arr[1:4])  # 输出: [20 30 40]

这就像是你直接找到第三格的糖果,或者一次取出第二格到第四格的糖果来尝尝。

4-4. 数组形状变换

如果你想要重新组织你的糖果盒子,比如,把它们从一排变成一个矩阵,Numpy 也能帮你轻松做到。

# 创建一个一维数组
arr = np.arange(6)  # [0 1 2 3 4 5]# 重新组织成 2x3 的数组
arr_reshape = arr.reshape(2, 3)
print(arr_reshape)

这就像是你把 6 颗糖果重新分配到了一个有两行三列的盒子里。

4-5. 数组的数学操作

Numpy 可以让你对整个糖果盒子进行数学操作,而不是一颗一颗地算。

# 创建一个数组
arr = np.array([1, 2, 3, 4, 5])# 计算所有糖果的总和
print(np.sum(arr))  # 输出: 15# 计算糖果的平均数
print(np.mean(arr))  # 输出: 3.0

这就像是你不需要数每一颗糖果就能知道盒子里糖果的总数和平均甜度。

4-6. 布尔索引

假设你只想要那些特别甜的糖果,Numpy 可以帮你找出来。

# 创建一个数组
arr = np.array([10, 20, 30, 40, 50])# 找出大于 25 的糖果
print(arr[arr > 25])  # 输出: [30 40 50]

这就像是你有一个魔法筛子,能筛出超级甜的糖果。

4-7. 数组的转置 (Transpose)

想象一下,你有一个盒子,里面的糖果是按行和列排列的。如果你想把行变成列,列变成行,这就是转置的魔法。

# 创建一个 2x3 的数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("原始数组:")
print(arr)# 使用转置
print("转置后的数组:")
print(arr.T)

这就像是你把盒子旋转了一下,让里面的糖果排列方式完全变了个样。

4-8. 数组的平迭

NumPy 的 ravel()flatten() 函数所要实现的功能是一致的,都是将多维数组降为一维数组。两者的区别在于返回拷贝(copy)还是返回视图(view),numpy.flatten()返回一份拷贝,对拷贝所做的修改不会影响原始矩阵,而numpy.ravel()返回的是视图,会影响原始矩阵。

4-8-1. flatten()

flatten() 方法可以将你的糖果盒子(不管它有多少层)压扁,变成一个一维数组,这样所有的糖果都会排成一行。

# 创建一个 2x3 的数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("原始数组:")
print(arr)# 使用 flatten
flattened_arr = arr.flatten()
print("压扁后的数组:")
print(flattened_arr)

这就像是你把盒子里的所有糖果都倒出来,排成一长排。

4-8-2. ravel()

ravel() 方法和 flatten() 很像,也是把多维数组变成一维,但它的工作方式略有不同。ravel() 尽可能地不创建数据的副本,所以它在某些情况下比 flatten() 更高效。

# 创建一个 2x3 的数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("原始数组:")
print(arr)# 使用 ravel
ravelled_arr = arr.ravel()
print("展平后的数组:")
print(ravelled_arr)

这就像是你把所有糖果从盒子里拿出来铺平,但尽量不去动它们,让它们保持原来的顺序。

4-9. 数组的排序

我们将学习如何整理和排序我们的糖果盒子,使用sort()argsort()方法,以及如何通过axis参数来控制我们排序的维度。

4-9-1. sort()

想象你有一个盒子,里面的糖果乱七八糟地放着。如果你想把它们按照甜度从小到大排序,这就是sort()方法的用武之地。

# 创建一个一维数组
arr = np.array([5, 3, 1, 4, 2])
print("原始数组:")
print(arr)# 对数组进行排序
sorted_arr = np.sort(arr)
print("排序后的数组:")
print(sorted_arr)

这就像是你把盒子里的糖果按照大小顺序重新排列了一遍。

如果你的糖果盒子有多层(即多维数组),你可以用axis参数来指定你想按哪个方向排序。

# 创建一个 2x3 的数组
arr_2d = np.array([[5, 2, 3], [1, 4, 6]])
print("原始数组:")
print(arr_2d)# 沿着每一行进行排序
print("沿行排序后:")
print(np.sort(arr_2d, axis=1))# 沿着每一列进行排序
print("沿列排序后:")
print(np.sort(arr_2d, axis=0))

这就像是你决定先按糖果的颜色排序,然后又改变主意按糖果的大小排序。

4-9-2. argsort()

argsort()方法有点特别,它不直接对糖果进行排序,而是告诉你如果想要排序,糖果的编号应该怎样排列。

# 创建一个一维数组
arr = np.array([5, 3, 1, 4, 2])
print("原始数组:")
print(arr)# 使用 argsort
sorted_indices = np.argsort(arr)
print("排序后的索引:")
print(sorted_indices)# 使用排序后的索引来排序
print("使用索引排序后的数组:")
print(arr[sorted_indices])

这就像是你得到了一张纸,上面写着如果想把糖果按甜度排序,应该怎么放它们。

如果你想在多维数组中使用argsort(),你也可以利用axis参数。

# 创建一个 2x3 的数组
arr_2d = np.array([[5, 2, 3], [1, 4, 6]])
print("原始数组:")
print(arr_2d)# 沿着每一列使用 argsort
column_indices = np.argsort(arr_2d, axis=0)
print("沿列排序后的索引:")
print(column_indices)# 沿着每一行使用 argsort
row_indices = np.argsort(arr_2d, axis=1)
print("沿行排序后的索引:")
print(row_indices)

这就像是你得到了一张更复杂的纸,上面告诉你如果想按不同的方式排序糖果,它们的编号应该怎样排列。

4-10. 数组的组合

有时我们会有许多糖果盒子,我们可能想要把它们堆叠起来或者连接起来,以便更好地管理。Numpy为我们提供了几种方法来做到这一点:hstack()vstack()concatenate()append()。让我们来看看它们是如何工作的,包括如何使用axis参数来控制操作的方向。

4-10-1. hstack()

hstack(),或称为"horizontal stack"(水平堆叠),让你可以把多个数组水平地连接起来。这种方式特别适合当你想要扩展你的糖果集合,把更多的糖果并排放在一起。

# 创建两个一维数组
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print("原始数组1:")
print(arr1)
print("原始数组2:")
print(arr2)# 水平堆叠
hstack_arr = np.hstack((arr1, arr2))
print("水平堆叠后:")
print(hstack_arr)

这就像是你把两盒糖果并排放置,现在它们组成了一个更大的糖果展示。

如果你的糖果盒子是多维的,hstack()依然能够工作,把它们水平地连接起来。

# 创建两个二维数组
arr1_2d = np.array([[1, 2, 3], [7, 8, 9]])
arr2_2d = np.array([[4, 5, 6], [10, 11, 12]])
print("原始二维数组1:")
print(arr1_2d)
print("原始二维数组2:")
print(arr2_2d)# 水平堆叠二维数组
hstack_arr_2d = np.hstack((arr1_2d, arr2_2d))
print("水平堆叠后的二维数组:")
print(hstack_arr_2d)

这就像是你把两个双层糖果盒子并排放置,使每层都更宽了。

通过hstack(),我们可以轻松地将不同的糖果盒子水平连接起来,无论是简单的一维数组还是更复杂的多维数组。

4-10-2. vstack()

vstack()是"vertical stack"(垂直堆叠)的缩写。想象你有几盒糖果,你想把它们堆叠起来,一盒放在另一盒的上面。

# 创建两个一维数组
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print("原始数组1:")
print(arr1)
print("原始数组2:")
print(arr2)# 垂直堆叠
vstack_arr = np.vstack((arr1, arr2))
print("垂直堆叠后:")
print(vstack_arr)

这就像是你把两盒糖果叠在一起,现在它们变成了一个两层的大盒子。

4-10-3. concatenate()

concatenate()方法可以让你选择是水平连接还是垂直连接数组。通过axis参数,你可以控制连接的方向:axis=0代表垂直连接,而axis=1代表水平连接。

# 创建两个一维数组
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])# 垂直连接
concat_arr_v = np.concatenate((arr1, arr2), axis=0)
print("垂直连接后:")
print(concat_arr_v)# 如果是二维数组,我们可以水平连接它们
arr1_2d = np.array([[1, 2, 3]])
arr2_2d = np.array([[4, 5, 6]])
concat_arr_h = np.concatenate((arr1_2d, arr2_2d), axis=1)
print("水平连接后:")
print(concat_arr_h)

这就像是你可以选择把两盒糖果放在一起变成一盒,或者把它们并排放置。

4-10-4. append()

append()方法可以将值添加到数组的末尾。默认情况下,它会将所有输入平铺成一维数组,但你也可以通过axis参数来指定添加的方向。

# 创建一个一维数组
arr = np.array([1, 2, 3])
print("原始数组:")
print(arr)# 添加元素
append_arr = np.append(arr, [4, 5, 6])
print("添加元素后:")
print(append_arr)# 创建两个二维数组
arr_2d_1 = np.array([[1, 2, 3]])
arr_2d_2 = np.array([[4, 5, 6]])# 垂直添加
append_arr_2d_v = np.append(arr_2d_1, arr_2d_2, axis=0)
print("垂直添加后:")
print(append_arr_2d_v)# 注意:对于二维数组,append不支持axis=1的直接操作,需要使用其他方法如concatenate来实现水平添加。

这就像是你可以决定把新的糖果放在盒子的底部,或者旁边,根据你想要的方式来扩展糖果盒子。

完结!

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

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

相关文章

openGauss学习笔记-219 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-网络

文章目录 openGauss学习笔记-219 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-网络219.1 查看网络状况 openGauss学习笔记-219 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-网络 获取openGauss节点的CPU、内存、I/O和网络资源使用情况,确认这些资源…

C# CAD2016 宗地生成界址点,界址点编号及排序

1 、界址点起点位置C# CAD2016 多边形顶点按方向重新排序 2、 界址点顺时针逆时针走向 C# CAD2016 判断多边形的方向正时针或逆时针旋转 3、块文件插入 //已知块文件名称 GXGLQTC //块文件需要插入的坐标点 scaledPoint// 插入块到当前图纸中的指定位置ObjectId newBlockId;B…

重复导航到当前位置引起的。Vue Router 提供了一种机制,阻止重复导航到相同的路由路径。

代码&#xff1a; <!-- 侧边栏 --><el-col :span"12" :style"{ width: 200px }"><el-menu default-active"first" class"el-menu-vertical-demo" select"handleMenuSelect"><el-menu-item index"…

python-分享篇-五子棋

文章目录 代码效果 代码 """五子棋之人机对战"""import sys import random import pygame from pygame.locals import * import pygame.gfxdraw from checkerboard import Checkerboard, BLACK_CHESSMAN, WHITE_CHESSMAN, offset, PointSIZE 3…

JVM(1)基础篇

1 初始JVM 1.1 什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; 分为三个步骤&#xff1a; 编写Java源代码文件。 使用…

Android实现底部导航栏方法(Navigation篇)

Navigation实现底部导航栏 前言导入和基本使用导入基础使用创建nav文件编辑Nav文件添加页面&#xff08;代码版&#xff09;添加页面&#xff08;图解版&#xff09; 创建导航动作 action创建action&#xff08;代码版&#xff09;创建action&#xff08;图解版&#xff09; 编…

评估与改进机器学习模型

Ml strategy 文章目录 Ml strategySingle Numble Evaluation Metricoptimizing and satisficing metricImproving model performanceTwo fundamentalReduce bias and varianceAvoidable biasvariance error analysiswaysIncorrectly labled examplesdiffenrent distributionsad…

「C++ 类和对象篇 12」static成员

目录 一、static成员是什么&#xff1f; 二、为什么需要static成员&#xff1f; 三、怎么使用static成员&#xff1f; 1. 定义static成员变量 2. 定义static成员函数 3. 访问static成员 四、特性 【面试题】 【总结】 一、static成员是什么&#xff1f; 被static修饰的类成…

品牌之门:概率与潜力的无限延伸

在品牌的世界里&#xff0c;每一个成功的推广都像是打开一扇门&#xff0c;从未知走向已知&#xff0c;从潜在走向显现。这扇门&#xff0c;既是品牌的起点&#xff0c;也是品牌发展的无限可能。 品牌&#xff0c;就像一扇紧闭的门&#xff0c;它静静地矗立在那里&#xff0c;…

微信强制分享红包裂变系统源码

这是一款新型的微信裂变引流系统源码&#xff0c;支持试看、直播、朋友圈转发、分享任务、 邀请入群、群聊、红包等多种裂变引流方式&#xff0c;让你的广告流量引流、吸粉变现更加高效。 该系统源码还优化了整个页面&#xff0c;减少了繁重多余的代码&#xff0c;让访问速度…

【51单片机】直流电机驱动(PWM)(江科大)

1.直流电机介绍 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 直流电机主要由永磁体(定子)、线圈(转子)和换向器组成 除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等 2.电机驱动…

如何在 Angular 中使用变更检测策略

简介 默认情况下&#xff0c;Angular 2 会在应用程序中的每次变化时对所有组件&#xff08;从上到下&#xff09;执行变更检测。变化可以来自用户事件或者从网络请求接收到的数据。 变更检测非常高效&#xff0c;但随着应用程序变得更加复杂并且组件数量增加&#xff0c;变更…

对(一维)数组与指针的深入理解(1)

目录 1.数组名的理解2.使用指针访问&#xff08;一维&#xff09;数组3.&#xff08;一维&#xff09;数组传参的本质 1.数组名的理解 以前我们在使用指针访问数组内容时&#xff0c;有这样的代码&#xff1a; #include <stdio.h>int main() {int arr[10] { 1,2,3,4,5…

详解Qt多线程(包含:什么是CPU,单核处理器和多核处理器,举餐厅和QQ音乐的例子详解进程和线程,Qt多线程案例)

目录 一.什么是CPU&#xff1f;二.单核处理器与多核处理器三.什么是进程和线程&#xff1f;3.1 定义3.2 以餐厅为例子解释进程和线程3.2 以QQ音乐为例子&#xff0c;解释QQ音乐里面的进程和线程 四.Qt中的多线程五.Qt多线程案例任务描述案例演示设置显示内容的字体大小和位置运…

pands常用操作

1.导入库和文件读取和文件分信息分析 import pandas as pd import numpy as np csvf pd.read_csv(D:/各个站程序版本说明.csv) csvf.info() <class pandas.core.frame.DataFrame> RangeIndex: 51 entries, 0 to 50 Data columns (total 6 columns):# Column Non-Nul…

java面试题整理

2023.2.14&#xff08;第二天&#xff09; 数组是不是对象&#xff1f; 在Java中&#xff0c;数组是对象。数组是一种引用类型&#xff0c;它可以存储固定大小的相同类型的元素序列。在Java中&#xff0c;数组是通过new关键字创建的&#xff0c;它们在内存中被分配为对象&…

Java 中 Hashtable和ConcurrentHashMap的区别

Hashtable和ConcurrentHashMap的区别 Hashtable 和 ConcurrentHashMap 都是 Java 中的集合框架中的 Map 接口实现类&#xff0c;但它们之间有很大的不同&#xff0c;特别是在多线程环境中。下面是它们之间的一些主要区别&#xff1a; 线程安全性&#xff1a; Hashtable 是线程…

<网络安全>《30 网络信息安全基础(1)常用术语整理》

1 肉鸡 所谓“肉鸡”是一种很形象的比喻&#xff0c;比喻那些可以随意被我们控制的电脑&#xff0c;对方可以是WINDOWS系统&#xff0c;也可以是UNIX/LINUX系统&#xff0c;可以是普通的个人电脑&#xff0c;也可以是大型的服务器&#xff0c;我们可以象操作自己的电脑那样来操…

网络世界的基石:深入探索OSI 7层模型的奥秘

引言 在当今互联网和计算机网络的复杂体系中&#xff0c;OSI&#xff08;开放系统互连&#xff09;参考模型提供了一个理解和设计网络通信协议的框架。自1984年由国际标准化组织&#xff08;ISO&#xff09;提出以来&#xff0c;OSI 7层模型已成为网络通信中最基本的概念之一。…

re:从0开始的CSS之旅 15. 浮动

1. 浮动 浮动&#xff1a;使元素浮起来&#xff0c;脱离文档流&#xff0c;从而使盒子能够灵活的移动。 浮动的属性&#xff1a; float 属性设置元素的浮动 可选值&#xff1a; none 元素不浮动&#xff0c;默认在文档流中排列&#xff08;默认值&#xff09; left 元素向左移…