系列文章目录


前言

一、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)

总结

分享:
吾所谓钟情者,是灵魂深处一种爱慕不可得已之情。由爱而慕、慕而达则为美满姻缘,慕而不达,则衷心藏焉,若远若近,若存若亡,而仍不失其为真情。此所谓爱情。

12-10 08:48