系列文章目录
文章目录
前言
一、NumPy简介
1、什么是Numpy?
NumPy是用于处理数组的python库。它还拥有在线性代数,傅里叶变换和矩阵领域中工作的函数。
2、为什么使用Numpy?
在python中,我没有满足数组功能的列表,但是处理起来很慢,Numpy旨在提供一个比传统python列表快50倍的数组对象。NumPy中的数组对象称为ndarray,它提供了许多支持函数,使得利用ndarray非常容易。数组在数据科学中非常常用,因为速度和资源非常重要。
注释:
1、ndarray(对象,多维数组)
2、数据科学:计算机科学的一个分支,研究如何存储,使用和分析数据从中获取信息。
3、为什么Numpy比列表快?
与列表不同,NumPy数组存储在内存中的一个连续位置,因此进程可以非常有效的访问和操纵它们,这种行为在计算机科学中称为引用的局部性。这是NumPy比列表快的主要原因,它还经过了优化,可与最新的CPU体系结构一同使用。
4、Numpy用哪种语言编写?
NumPy是一个python库,部分用python编写,但是大多数需要快速计算的部分都是用C或C++编写的。
5、Numpy代码库在哪里?
NumPy的源代码位于github资料库中:NumPy
github:使得许多人可以在同一个代码库上工作。
二、NumPy入门
1、安装Numpy
pip install numpy #如果此命令失败,可以使用安装了numpy的python发行版
2、导入Numpy
import numpy
示例:
import numpy
arr = numpy.array([1,2,3,4,5])
print(arr)
Result:
[1 2 3 4 5]
3、Numpy as np
numpy通常以np别名导入
import numpy as np
示例:
import numpy as np
arr = numpy.array([1,2,3,4,5])
print(arr)
4、检查Numpy版本
import numpy as np
print(np.__version__)
Result:
1.21.5
三、NumPy创建
1、创建Numpy ndarray对象
numpy用于处理数组,numpy中的数组称为ndarray,我们可以使用array()函数创建一个numpy ndarray对象。
import numpy as np
arr = np.array([1,2,3,4,5])
print(arr)
print(type(arr))
Result:
[1 2 3 4 5]
<class 'numpy.ndarray'>
备注:type():这个内置的python函数告诉我们传递给它的对象的类型,它表明arr是numpy.ndarray类型。要创建ndarray,我们可以将列表、元组或任何类似数组的对象传递给array()方法,然后它将被转换为ndarray。
示例:使用元组创建numpy数组
import numpy as np
arr = np.array((1,2,3,4,5))
print(arr)
Result:
[1 2 3 4 5]
数组中的维
数组中的维是数组的维度(嵌套数组)的一个级别。
嵌套数组:指的是将数组作为元素的数组。
0-D数组
0-D数组,或标量(Scalars),是数组中的元素,数组中的每个值都是一个0-D数组。
示例:用60创建0-D数组
import numpy as np
arr = np.array(60)
print(arr)
Result:
60
1-D数组
其元素为0-D数组的数组,称为一维或1-D数组。
示例:创建包含1,2,3,4,5,6的一维数组
import numpy as np
arr = np.array([1,2,3,4,5])
print(arr)
Result:
[1 2 3 4 5]
2-D数组
其元素为1-D数组的数组,称为2-D数组,它们通常用于表示矩阵或二阶张量,Numpy有一个专门用于矩阵运算的完整子模块numpy.mat。
示例:创建包含值1、2、3;4、5、6两个数组的2-D数组
import numpy as np
arr = np.array([[1,2,3],[4,5,6]])
print(arr)
Result:
[[1 2 3]
[4 5 6]]
3-D数组
示例:用两个2-D数组创建一个3-D数组
import numpy as np
arr2 = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(arr)
Result:
[[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]
检查维数?
NumPy数组提供了ndim属性,该属性返回一个整数,该整数提供了维数。
import numpy as np
arr = np.array(60)
arr0 = np.array([1,2,3,4,5,6])
arr1 = np.array([[1,2,3],[4,5,6]])
arr2 = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(arr.ndim)
print(arr0.ndim)
print(arr1.ndim)
print(arr2.ndim)
Result:
0
1
2
3
更高维数组
数组可以拥有任意维数的维,可以用ndmin参数定义维数
示例:创建5个维度的数组,并验证
import numpy as np
arr = np.array([1,2,3,4],ndmin=5)
print(arr)
print('number of dimension :',arr.ndim)
Result:
[[[[[1 2 3 4]]]]]
number of dimension : 5
注释:在此数组中,最里面的维度(第 5 个 dim)有 4 个元素,第 4 个 dim 有 1 个元素作为向量,第 3 个 dim 具有 1 个元素是与向量的矩阵,第 2 个 dim 有 1 个元素是 3D 数组,而第 1 个 dim 有 1 个元素,该元素是 4D 数组。
四、NumPy数组索引
访问数组元素
数组索引等同于访问数组元素,我们可以通过引用其索引号来访问数组元素,Numpy数组的索引以0开头,这意味着第一个元素索引为0,第二个索引为1;
import numpy as np
arr = np.array([1,2,3,4,5])
print(arr[0]) #获取第一个元素
print(arr[1]) #获取第二个元素
print(arr[2]+arr[3]) #获取第三个和第四个元素并相加
Result:
1
2
7
访问2-D数组元素
要访问二维数组中的元素,我们可以使用逗号分隔的整数表示元素的维数和索引。
import numpy as np
arr = np.array([[1,2,3,4,5],[6,7,8,9,10]])
print('2nd element on 1st dim:',arr[0,1]) #访问第一维中的第二个元素
Result:
2
访问3-D数组元素
import numpy as np
arr = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(arr[0,1,2]) #访问第一个数组的第二个数组的第三个元素
Result:
6
负索引
使用负索引从尾开始访问数组
import numpy as np
arr = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
print(arr[0,1,-2]) #访问第一个数组的第二个数组的第三个元素
Result:
5
五、NumPy数组裁切
python中裁切的意思就是将元素从一个给定的索引带到另一个给定的索引;
裁切数组
我们像这样传递切片而不是索引:[start:end];
我们还可以定义步长:[start: end: step];
如果我们不传递start,则将其视为0;
如果我们不传递end,则视为该维度内数组长度;
如果我们不传递step,则视为1;
示例:从下面数组中裁切索引为1到索引为5的元素
import numpy as np
arr = np.array([1,2,3,4,5,6])
print(arr[1:5])
Result:
[2 3 4 5] #结果包含了开始索引,不包含结束索引
负裁切
import numpy as np
arr = np.array([1,2,3,4,5,6])
print(arr[-4:-1])
Result:
[3 4 5] #结果包含了开始索引,不包含结束索引
step
示例一:用step值确定裁切的步长
import numpy as np
arr = np.array([1,2,3,4,5,6,7,8,9])
print(arr[1:7:2])
Result:
[2 4 6] #结果包含了开始索引,不包含结束索引
示例二:返回数组中相隔的元素
import numpy as np
arr = np.array([1,2,3,4,5,6,7,8,9])
print(arr[::2])
Result:
[1 3 5 7 9]
裁切2-D数组
示例一:从第二个元素开始,对从索引1到索引4(不包括)进行切片
import numpy as np
arr = np.array([[1,2,3,4,5],[6,7,8,9,10]])
print(arr[1,1:4])
Result:
[7 8 9]
示例二:
import numpy as np
arr = np.array([[1,2,3,4,5],[6,7,8,9,10]])
print(arr[0:3,1:4])
Result:
[[2 3 4]
[7 8 9]]
六、NumPy数据类型
python中的数据类型
- strings -用于表示文本数据,文本用引号引起来,例如:“abcd”;
- integer -用于表示整数,例如:-1,-2,-3;
- float -用于表示实数,例如:1.2,4.6;
- boolean -用于表示True或False;
- complex -用于表示复平面的数字,例如:1.0+2.4j;
NumPy中的数据类型
Numpy有一些额外的数据类型,并通过一个字符引用数据类型,例如,i代表整数,u代表无符号整数等;
- i -整数
- b -布尔
- u -无符号整数
- f -浮点
- c -复合浮点数
- m -timedelta
- M -datetime
- O -对象
- S - 字符串
- U - unicode 字符串
- V -固定的其它类型的内存块(void)
检查数组的数据类型
numpy数组对象有一个名为dtype的属性,该属性返回数组的数据类型:
import numpy as np
arr = np.array([1,2,3,4,5])
arr1 = np.array(['windows','linux','mac','other'])
print(arr.dtype)
print(arr1.dtype)
Result:
int32
<U7
用已定义的数据类型创建数组
我们使用array()函数来创建数组,该函数可以使用可选参数:dtype,它允许我们自定义数组元素的预期数据类型:
import numpy as np
arr = np.array([1,2,3,4],dtype='S')
print(arr)
print(arr.dtype)
Result:
[b'1' b'2' b'3' b'4']
|S1
假如值无法转换:
如果给出了不能强制转换元素的类型,则Numpy将引发ValueError.
示例:无法将非整数字符串(比如’a’)转换为整数
import numpy as np
arr = np.array(['a','1','2','3',dtype='i'])
Result:
File ".\rumen2.py", line 87
arr = np.array(['a','1','2','3',dtype='i'])
^
SyntaxError: invalid syntax
转换已有数组的数据类型
更改现有数组的数据类型的最佳方法,是使用astype()方法复制该数组。astype()函数创建数组的副本,并允许我们将数据类型指定为参数。数据类型可以使用字符串指定,例如’f’表示浮点数,'i’表示整数等,或者我们也可以直接使用数据类型,例如float&int.
import numpy as np
arr = np.array([1.1,2.1,3.1])
newarr = arr.astype('i')
print(newarr)
print(newarr.dtype)
Result:
[1 2 3]
int32
七、NumPy副本/视图
NumPy数组副本vs视图
- 副本和数组视图之间的主要区别在于副本是一个新数组,而这个视图只是原始数据的视图。
- 副本拥有数据,对副本所做的任何更改都不会影响原始数组,对原始数组所做的任何更改也不会影响副本。
- 视图不拥有数据,对视图所做的任何更改会影响原始数组,而对原始数组所做的任何更改都会影响视图。
示例:进行复制,更改原始数组并显示两个数组
该副本不应受到对原始数组所做更改的影响
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
x = arr.copy()
arr[0] = 61
print(arr)
print(x)
Result:
[61 2 3 4 5]
[1 2 3 4 5]
示例:创建试图,更改原始数组,然后显示两个数组
试图应该受到对原始数组所做更改的影响
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
x = arr.view()
arr[0] = 61
print(arr)
print(x)
Result:
[61 2 3 4 5]
[61 2 3 4 5]
检查数组是否拥有数据
如上所述,副本拥有数据,而视图不拥有数据,我们如何检查?
每个NumPy数组都有一个属性base,如果该数组拥有数据,则这个base属性返回None.否则base属性将引用原始对象。
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
x = arr.copy()
y = arr.view()
print(x.base)
print(y.base)
Result:
None #副本返回None,视图返回原始数组
[1 2 3 4 5]
八、NumPy数据形状
数组的形状:数组的形状是每个维中元素的数量。
获取数组的形状
NumPy数组有一个名为shape的属性,该属性返回一个数组,每个索引具有相应元素的数量。
示例:打印2-D数组的形状
import numpy as np
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(arr.shape)
Result:
(2, 4) #2个维,每个维4个元素
示例:利用ndmin使用值1,2,3,4,的向量创建有5个维度的数组,并验证最后一个维度的值为4
import numpy as np
arr = np.array([1, 2, 3, 4], ndmin=5)
print(arr)
print('shape of array :', arr.shape)
Result:
[[[[[1 2 3 4]]]]]
shape of array : (1, 1, 1, 1, 4)
元组的形状代表什么?
每个索引处的整数表明相应维度拥有的元素数量,上例中的索引4,我们的值为4,因此可以说第5个(4+1th)维度有4个元素。
九、NumPy数组重塑
数组重塑:意味着更改数组的形状。数组的形状是每个维中元素的数量。通过重塑我们可以添加或删除维度或更改每个维度中的元素数量。
从1-D重塑为2-D
示例:将以下具有12个元素的1-D数组转换为2-D数组。最外层的维度将有4个数组,每个数组包含3个元素。
import numpy as np
arr = np.array([1, 2, 3, 4], ndmin=5)
print(arr)
print('shape of array :', arr.shape)
Result:
[[[[[1 2 3 4]]]]]
shape of array : (1, 1, 1, 1, 4)
十、NumPy数组迭代
数组迭代意味着逐一遍历元素,当我们在numpy中处理多维数组时,可以使用python的基本for循环来完成此操作。
实例一:迭代一维数组元素
import numpy as np
arr = np.array([1,2,3])
for x in arr:
print(x)
实例一:迭代二维数组元素
import numpy as np
arr = np.array([1,2,3])
for x in arr:
print(x)
总结
分享:
吾所谓钟情者,是灵魂深处一种爱慕不可得已之情。由爱而慕、慕而达则为美满姻缘,慕而不达,则衷心藏焉,若远若近,若存若亡,而仍不失其为真情。此所谓爱情。