自学python之路

大数据实验室第6次学习打卡

一、numpy简介

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 ++ 编写的。

二、numpy入门

1.安装 NumPy

如果已经在系统上安装了 Python 和 PIP,那么安装 NumPy 非常容易。
请使用这条命令安装它:
C:\Users\Your Name>pip install numpy
如果此命令失败,使用已经安装了 NumPy 的 python 发行版,例如 Anaconda、Spyder 等。

导入 NumPy
安装 NumPy 后,通过添加 import 关键字将其导入您的应用程序:
import numpy
现在,Numpy 已导入并可以使用。

实例

python版本和numpy numpy与python_python版本和numpy


检查 NumPy 版本

版本字符串存储在 version 属性中。

实例

python版本和numpy numpy与python_python_02

三、数组创建

创建 NumPy ndarray 对象

NumPy 用于处理数组。 NumPy 中的数组对象称为 ndarray。

我们可以使用 array() 函数创建一个 NumPy ndarray 对象。

实例

python版本和numpy numpy与python_数组_03

type(): 这个内置的 Python 函数告诉我们传递给它的对象的类型。像上面的代码一样,它表明 arr 是 numpy.ndarray 类型。

要创建 ndarray,我们可以将列表、元组或任何类似数组的对象传递给 array() 方法,然后它将被转换为 ndarray:

实例

使用元组创建 NumPy 数组:

python版本和numpy numpy与python_数组_04


数组中的维

数组中的维是数组深度(嵌套数组)的一个级别。

嵌套数组:指的是将数组作为元素的数组。0-D 数组

0-D 数组,或标量(Scalars),是数组中的元素。数组中的每个值都是一个 0-D 数组。

实例

用值 61 创建 0-D 数组:

python版本和numpy numpy与python_数组_05


1-D 数组

其元素为 0-D 数组的数组,称为一维或 1-D 数组。

这是最常见和基础的数组。

实例

创建包含值 1、2、3、4、5、6 的 1-D 数组:

python版本和numpy numpy与python_机器学习_06


2-D 数组

其元素为 1-D 数组的数组,称为 2-D 数组。

它们通常用于表示矩阵或二阶张量。

NumPy 有一个专门用于矩阵运算的完整子模块 numpy.mat。

实例

创建包含值 1、2、3 和 4、5、6 两个数组的 2-D 数组:

python版本和numpy numpy与python_python版本和numpy_07


3-D 数组

其元素为 2-D 数组的数组,称为 3-D 数组。

实例

用两个 2-D 数组创建一个 3-D 数组,这两个数组均包含值1、2、3 和 4、5、6 的两个数组:

python版本和numpy numpy与python_数组_08


检查维数

NumPy 数组提供了 ndim 属性,该属性返回一个整数,该整数会告诉我们数组有多少维。

实例

检查数组有多少维:

python版本和numpy numpy与python_数组_09


更高维的数组

数组可以拥有任意数量的维。

在创建数组时,可以使用 ndmin 参数定义维数。

实例

创建一个有 5 个维度的数组,并验证它拥有 5 个维度:

python版本和numpy numpy与python_python版本和numpy_10

四、数组索引

访问数组元素
数组索引等同于访问数组元素。
您可以通过引用其索引号来访问数组元素。
NumPy 数组中的索引以 0 开头,这意味着第一个元素的索引为 0,第二个元素的索引为 1,以此类推。

负索引
使用负索引从尾开始访问数组。

五、数组裁切

裁切数组

python 中裁切的意思是将元素从一个给定的索引带到另一个给定的索引。

我们像这样传递切片而不是索引:[start:end]。

我们还可以定义步长,如下所示:[start:end:step]。

如果我们不传递 start,则将其视为 0。

如果我们不传递 end,则视为该维度内数组的长度。

如果我们不传递 step,则视为 1。

实例

python版本和numpy numpy与python_python_11

六、数据类型

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 的属性,该属性返回数组的数据类型:

实例

获取数组对象的数据类型:

python版本和numpy numpy与python_python_12


用已定义的数据类型创建数组

我们使用 array() 函数来创建数组,该函数可以使用可选参数:dtype,它允许我们定义数组元素的预期数据类型:

实例

创建数据类型为 4 字节整数的数组:

python版本和numpy numpy与python_NumPy_13


假如值无法转换会怎样?

如果给出了不能强制转换元素的类型,则 NumPy 将引发 ValueError。

ValueError:在 Python 中,如果传递给函数的参数的类型是非预期或错误的,则会引发 ValueError。转换已有数组的数据类型

更改现有数组的数据类型的最佳方法,是使用 astype() 方法复制该数组。

astype() 函数创建数组的副本,并允许您将数据类型指定为参数。

数据类型可以使用字符串指定,例如 ‘f’ 表示浮点数,‘i’ 表示整数等。或者您也可以直接使用数据类型,例如 float 表示浮点数,int 表示整数。

实例

通过使用 ‘i’ 作为参数值,将数据类型从浮点数更改为整数:

python版本和numpy numpy与python_数组_14

七、副本/视图

副本和视图之间的区别
副本和数组视图之间的主要区别在于副本是一个新数组,而这个视图只是原始数组的视图。
副本拥有数据,对副本所做的任何更改都不会影响原始数组,对原始数组所做的任何更改也不会影响副本。
视图不拥有数据,对视图所做的任何更改都会影响原始数组,而对原始数组所做的任何更改都会影响视图。

副本

实例:

python版本和numpy numpy与python_NumPy_15


视图

实例

创建视图,更改原始数组,然后显示两个数组:

python版本和numpy numpy与python_机器学习_16

检查数组是否拥有数据

如上所述,副本拥有数据,而视图不拥有数据,但是我们如何检查呢?

每个 NumPy 数组都有一个属性 base,如果该数组拥有数据,则这个 base 属性返回 None。

否则,base 属性将引用原始对象。

实例

打印 base 属性的值以检查数组是否拥有自己的数据:

python版本和numpy numpy与python_数组_17

八、数组形状

数组的形状: 数组的形状是每个维中元素的数量。

获取数组的形状

NumPy 数组有一个名为 shape 的属性,该属性返回一个元组,每个索引具有相应元素的数量。

实例

打印 2-D 数组的形状(该数组有 2 个维,每个维有 4 个元素):

python版本和numpy numpy与python_数组_18


实例

利用 ndmin 使用值 1,2,3,4 的向量创建有 5 个维度的数组,并验证最后一个维度的值为 4:

python版本和numpy numpy与python_python版本和numpy_19

九、数组重塑

含义: 重塑意味着更改数组的形状。通过重塑,我们可以添加或删除维度或更改每个维度中的元素数量。

从 1-D 重塑为 2-D

实例

将以下具有 12 个元素的 1-D 数组转换为 2-D 数组。

最外面的维度将有 4 个数组,每个数组包含 3 个元素:

python版本和numpy numpy与python_python版本和numpy_20


从 1-D 重塑为 3-D

python版本和numpy numpy与python_python版本和numpy_21


返回副本还是视图?

实例

检查返回的数组是副本还是视图(返回原始数组,因此它是一个视图):

python版本和numpy numpy与python_NumPy_22


未知的维

可以使用一个“未知”维度。这意味着不必在 reshape 方法中为维度之一指定确切的数字。

传递 -1 作为值,NumPy 将为您计算该数字。

实例

将 8 个元素的 1D 数组转换为 2x2 元素的 3D 数组:

python版本和numpy numpy与python_python版本和numpy_23

展平数组

展平数组(Flattening the arrays)是指将多维数组转换为 1D 数组。

我们可以使用 reshape(-1) 来做到这一点。

实例

把数组转换为 1D 数组:

python版本和numpy numpy与python_NumPy_24

十、数组迭代

数组迭代:迭代意味着逐一遍历元素。当我们在 numpy 中处理多维数组时,可以使用 python 的基本 for 循环来完成此操作。

如果我们对 1-D 数组进行迭代,它将逐一遍历每个元素。

实例

迭代以下一维数组的元素:

python版本和numpy numpy与python_python版本和numpy_25


迭代 2-D 数组:

python版本和numpy numpy与python_NumPy_26


迭代 2-D 数组的每个标量元素:

python版本和numpy numpy与python_机器学习_27


使用 nditer() 迭代数组

函数 nditer() 是一个辅助函数,从非常基本的迭代到非常高级的迭代都可以使用。它解决了我们在迭代中面临的一些基本问题,让我们通过例子进行介绍。

迭代每个标量元素

在基本的 for 循环中,迭代遍历数组的每个标量,我们需要使用 n 个 for 循环,对于具有高维数的数组可能很难编写。

实例

遍历以下 3-D 数组:

python版本和numpy numpy与python_python版本和numpy_28


迭代不同数据类型的数组

我们可以使用 op_dtypes 参数,并传递期望的数据类型,以在迭代时更改元素的数据类型。

NumPy 不会就地更改元素的数据类型(元素位于数组中),因此它需要一些其他空间来执行此操作,该额外空间称为 buffer,为了在 nditer() 中启用它,我们传参 flags=[‘buffered’]。

实例

以字符串形式遍历数组:

python版本和numpy numpy与python_python版本和numpy_29


以不同的步长迭代

我们可以使用过滤,然后进行迭代。

实例

每遍历 2D 数组的一个标量元素,跳过 1 个元素:

python版本和numpy numpy与python_python版本和numpy_30


使用 ndenumerate() 进行枚举迭代

枚举是指逐一提及事物的序号。

有时,我们在迭代时需要元素的相应索引,对于这些用例,可以使用 ndenumerate() 方法。

实例

枚举以下 2D 数组元素:

python版本和numpy numpy与python_NumPy_31