大数据实验室第6次学习打卡
1.什么是numpy
NumPy 是用于处理数组的 python 库。
它还拥有在线性代数、傅立叶变换和矩阵领域中工作的函数。
NumPy 由 Travis Oliphant 于 2005 年创建。它是一个开源项目,您可以自由使用它。
NumPy 指的是数值 Python(Numerical Python)。
2.为何使用numpy
在python中,有满足数组功能的列表,但是处理起来很慢。
numpy旨在提供一个比传统python列表快50倍的数组对象。
numpy中的数组对象称为nddarray,它提供了许多支持函数,使得利用ndarray非常容易。
数组在数据科学中非常常用,因为速度和资源非常重要。
3.为什么numpy比列表快
与列表不同,numpy数组存储在内存中的一个连续位置,因此进程可以非常有效地访问和操纵它们。
这种行为在计算机科学中称为引用的局部性。
这是 NumPy 比列表更快的主要原因。它还经过了优化,可与最新的 CPU 体系结构一同使用。
4.NumPy 用哪种语言编写?
NumPy 是一个 Python 库,部分用 Python 编写,但是大多数需要快速计算的部分都是用 C 或 C ++ 编写的。
1.安装 NumPy
如果已经在系统上安装了 Python 和 PIP,那么安装 NumPy 非常容易。
请使用这条命令安装它:
C:\Users\Your Name>pip install numpy
如果此命令失败,使用已经安装了 NumPy 的 python 发行版,例如 Anaconda、Spyder 等。
导入 NumPy
安装 NumPy 后,通过添加 import 关键字将其导入您的应用程序:
import numpy
现在,Numpy 已导入并可以使用。
实例
检查 NumPy 版本
版本字符串存储在 version 属性中。
实例
创建 NumPy ndarray 对象
NumPy 用于处理数组。 NumPy 中的数组对象称为 ndarray。
我们可以使用 array() 函数创建一个 NumPy ndarray 对象。
实例
type(): 这个内置的 Python 函数告诉我们传递给它的对象的类型。像上面的代码一样,它表明 arr 是 numpy.ndarray 类型。
要创建 ndarray,我们可以将列表、元组或任何类似数组的对象传递给 array() 方法,然后它将被转换为 ndarray:
实例
使用元组创建 NumPy 数组:
数组中的维
数组中的维是数组深度(嵌套数组)的一个级别。
嵌套数组:指的是将数组作为元素的数组。
0-D 数组
0-D 数组,或标量(Scalars),是数组中的元素。数组中的每个值都是一个 0-D 数组。
实例
用值 61 创建 0-D 数组:
1-D 数组
其元素为 0-D 数组的数组,称为一维或 1-D 数组。
这是最常见和基础的数组。
实例
创建包含值 1、2、3、4、5、6 的 1-D 数组:
2-D 数组
其元素为 1-D 数组的数组,称为 2-D 数组。
它们通常用于表示矩阵或二阶张量。
NumPy 有一个专门用于矩阵运算的完整子模块 numpy.mat。
实例
创建包含值 1、2、3 和 4、5、6 两个数组的 2-D 数组:
3-D 数组
其元素为 2-D 数组的数组,称为 3-D 数组。
实例
用两个 2-D 数组创建一个 3-D 数组,这两个数组均包含值1、2、3 和 4、5、6 的两个数组:
检查维数
NumPy 数组提供了 ndim 属性,该属性返回一个整数,该整数会告诉我们数组有多少维。
实例
检查数组有多少维:
更高维的数组
数组可以拥有任意数量的维。
在创建数组时,可以使用 ndmin 参数定义维数。
实例
创建一个有 5 个维度的数组,并验证它拥有 5 个维度:
访问数组元素
数组索引等同于访问数组元素。
您可以通过引用其索引号来访问数组元素。
NumPy 数组中的索引以 0 开头,这意味着第一个元素的索引为 0,第二个元素的索引为 1,以此类推。
负索引
使用负索引从尾开始访问数组。
裁切数组
python 中裁切的意思是将元素从一个给定的索引带到另一个给定的索引。
我们像这样传递切片而不是索引:[start:end]。
我们还可以定义步长,如下所示:[start:end:step]。
如果我们不传递 start,则将其视为 0。
如果我们不传递 end,则视为该维度内数组的长度。
如果我们不传递 step,则视为 1。
实例
Python 中的数据类型
默认情况下,Python 拥有以下数据类型:
strings - 用于表示文本数据,文本用引号引起来。例如 “ABCD”。
integer - 用于表示整数。例如 -1, -2, -3。
float - 用于表示实数。例如 1.2, 42.42。
boolean - 用于表示 True 或 False。
complex - 用于表示复平面中的数字。例如 1.0 + 2.0j,1.5 + 2.5j。
NumPy 中的数据类型
NumPy 有一些额外的数据类型,并通过一个字符引用数据类型,例如 i 代表整数,u 代表无符号整数等。
以下是 NumPy 中所有数据类型的列表以及用于表示它们的字符。
i - 整数
b - 布尔
u - 无符号整数
f - 浮点
c - 复合浮点数
m - timedelta
M - datetime
O - 对象
S - 字符串
U - unicode 字符串
V - 固定的其他类型的内存块 ( void )
检查数组的数据类型
NumPy 数组对象有一个名为 dtype 的属性,该属性返回数组的数据类型:
实例
获取数组对象的数据类型:
用已定义的数据类型创建数组
我们使用 array() 函数来创建数组,该函数可以使用可选参数:dtype,它允许我们定义数组元素的预期数据类型:
实例
创建数据类型为 4 字节整数的数组:
假如值无法转换会怎样?
如果给出了不能强制转换元素的类型,则 NumPy 将引发 ValueError。
ValueError:在 Python 中,如果传递给函数的参数的类型是非预期或错误的,则会引发 ValueError。
转换已有数组的数据类型
更改现有数组的数据类型的最佳方法,是使用 astype() 方法复制该数组。
astype() 函数创建数组的副本,并允许您将数据类型指定为参数。
数据类型可以使用字符串指定,例如 ‘f’ 表示浮点数,‘i’ 表示整数等。或者您也可以直接使用数据类型,例如 float 表示浮点数,int 表示整数。
实例
通过使用 ‘i’ 作为参数值,将数据类型从浮点数更改为整数:
副本和视图之间的区别
副本和数组视图之间的主要区别在于副本是一个新数组,而这个视图只是原始数组的视图。
副本拥有数据,对副本所做的任何更改都不会影响原始数组,对原始数组所做的任何更改也不会影响副本。
视图不拥有数据,对视图所做的任何更改都会影响原始数组,而对原始数组所做的任何更改都会影响视图。
副本
实例:
视图
实例
创建视图,更改原始数组,然后显示两个数组:
检查数组是否拥有数据
如上所述,副本拥有数据,而视图不拥有数据,但是我们如何检查呢?
每个 NumPy 数组都有一个属性 base,如果该数组拥有数据,则这个 base 属性返回 None。
否则,base 属性将引用原始对象。
实例
打印 base 属性的值以检查数组是否拥有自己的数据:
数组的形状: 数组的形状是每个维中元素的数量。
获取数组的形状
NumPy 数组有一个名为 shape 的属性,该属性返回一个元组,每个索引具有相应元素的数量。
实例
打印 2-D 数组的形状(该数组有 2 个维,每个维有 4 个元素):
实例
利用 ndmin 使用值 1,2,3,4 的向量创建有 5 个维度的数组,并验证最后一个维度的值为 4:
含义: 重塑意味着更改数组的形状。通过重塑,我们可以添加或删除维度或更改每个维度中的元素数量。
从 1-D 重塑为 2-D
实例
将以下具有 12 个元素的 1-D 数组转换为 2-D 数组。
最外面的维度将有 4 个数组,每个数组包含 3 个元素:
从 1-D 重塑为 3-D
返回副本还是视图?
实例
检查返回的数组是副本还是视图(返回原始数组,因此它是一个视图):
未知的维
可以使用一个“未知”维度。这意味着不必在 reshape 方法中为维度之一指定确切的数字。
传递 -1 作为值,NumPy 将为您计算该数字。
实例
将 8 个元素的 1D 数组转换为 2x2 元素的 3D 数组:
展平数组
展平数组(Flattening the arrays)是指将多维数组转换为 1D 数组。
我们可以使用 reshape(-1) 来做到这一点。
实例
把数组转换为 1D 数组:
数组迭代:迭代意味着逐一遍历元素。当我们在 numpy 中处理多维数组时,可以使用 python 的基本 for 循环来完成此操作。
如果我们对 1-D 数组进行迭代,它将逐一遍历每个元素。
实例
迭代以下一维数组的元素:
迭代 2-D 数组:
迭代 2-D 数组的每个标量元素:
使用 nditer() 迭代数组
函数 nditer() 是一个辅助函数,从非常基本的迭代到非常高级的迭代都可以使用。它解决了我们在迭代中面临的一些基本问题,让我们通过例子进行介绍。
迭代每个标量元素
在基本的 for 循环中,迭代遍历数组的每个标量,我们需要使用 n 个 for 循环,对于具有高维数的数组可能很难编写。
实例
遍历以下 3-D 数组:
迭代不同数据类型的数组
我们可以使用 op_dtypes 参数,并传递期望的数据类型,以在迭代时更改元素的数据类型。
NumPy 不会就地更改元素的数据类型(元素位于数组中),因此它需要一些其他空间来执行此操作,该额外空间称为 buffer,为了在 nditer() 中启用它,我们传参 flags=[‘buffered’]。
实例
以字符串形式遍历数组:
以不同的步长迭代
我们可以使用过滤,然后进行迭代。
实例
每遍历 2D 数组的一个标量元素,跳过 1 个元素:
使用 ndenumerate() 进行枚举迭代
枚举是指逐一提及事物的序号。
有时,我们在迭代时需要元素的相应索引,对于这些用例,可以使用 ndenumerate() 方法。
实例
枚举以下 2D 数组元素: