NumPy 是一个用于科学计算的 Python 库。它提供了高效的多维数组对象 ndarray 和大量用于操作数组的函数。NumPy 的主要功能包括:

  • 快速的数组运算。

  • 矩阵运算。

  • 用于随机数生成的函数。

  • 线性代数运算。

  • 统计函数(如最大值、最小值、平均值、中位数等)。

NumPy 在科学计算中广泛使用,因为它提供了高效的数组运算和矩阵运算,可以大大简化科学计算的代码。它还可以与其他的数据分析库(如 pandasSciPy)很好地集成,提供更强大的数据分析功能。一般来说,NumPy 是在 Python 中进行科学计算的基础库,是很多科学计算库的基础。如果要在 Python 中进行科学计算,建议先学习 NumPy 库。

文档与参考网址:

安装

pip install numpy

引入

import numpy as np

Numpy的核心:ndarray

NumPy的核心是ndarray(n维数组)对象,它是一个快速、灵活且可扩展的多维数组。你可以把ndarray看作为数学中的向量。

Ndarray的内部结构

ndarray对象由两部分组成:数据和描述数据的元数据。数据是实际数组元素,而元数据包括数组的形状、数据类型和存储顺序。

创建ndarray

你可以通过调用NumPy的array函数来创建ndarray对象,它接受一个可迭代的对象(如列表、元组或其他数组)并返回一个新的ndarray对象。例如:

import numpy as np
​
# 创建一个一维数组
a = np.array([1, 2, 3])
print(a)  # [1 2 3]
​
# 创建一个二维数组
b = np.array([[1, 2, 3], [4, 5, 6]])
print(b)  # [[1 2 3]
         #      [4 5 6]]

除此之外,还可以使用其他的方式创建ndarray对象。如下:

  • np.zeros(shape): 创建一个元素都为0的数组,shape可以是数字也可以是元组,如果输入一个数字,则创建一个有n个元素的向量,输入元组则创建一个x * y的矩阵

# 创建一个元素都为0的3x3矩阵
np.zeros((3, 3)) #     [[0. 0. 0.]
                 #      [0. 0. 0.]
                 #      [0. 0. 0.]]
​
# 创建一个元素都为0并且有3个元素的向量
np.zeros(3) # [0. 0. 0.]
  • np.ones(shape): 创建一个元素都为1的数组,shape可以是数字也可以是元组,如果输入一个数字,则创建一个有n个元素的向量,输入元组则创建一个x * y的矩阵

# 创建一个元素都为1的3x3数组
np.ones((3, 3))  #     [[1. 1. 1.]
                 #      [1. 1. 1.]
                 #      [1. 1. 1.]]
# 创建一个元素都为1并且有3个元素的向量
np.ones(3) # [1. 1. 1.]
  • np.eye(N): 创建一个n * n的单位矩阵

# 创建一个3x3的单位矩阵
np.eye(3) #     [[1. 0. 0.]
          #      [0. 1. 0.]
          #      [0. 0. 1.]]
  • np.arange(start, stop, step): 创建一个等差数列的数组

# 创建一个等差数列数组,起始值为0,终止值为1,步长为0.1
np.arange(0, 1, 0.1) #  [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
  • np.linspace(start, stop, num=50): 创建一个均匀分布的数组

# 创建一个均匀分布的数组,起始值为0,终止值为1,元素个数为5
np.linspace(0, 1, 5) #  [0.   0.25 0.5  0.75 1.  ]
  • np.random.random(size): 创建一个的随机数(大小不大于1)的数组,size可以是数字也可以是元组,如果输入一个数字,则创建一个有n个元素的向量,输入元组则创建一个x * y的矩阵

# 创建一个3x3的随机数矩阵
np.random.random((3, 3))    #     [[0.79687771 0.13244968 0.21523274]
                            #      [0.24786926 0.32724818 0.78840362]
                            #      [0.15807901 0.11015224 0.74444607]]
# 创建一个具有3个元素的随机数向量
np.random.random(3) # [0.3172022  0.51064917 0.88901291]
  • np.full(shape, fill_value): 创建一个填充数组,fill_value为填充的内容,shape可以是数字也可以是元组,如果输入一个数字,则创建一个有n个元素的向量,输入元组则创建一个x * y的矩阵

# 创建一个3x3的常数矩阵
np.full((3, 3), np.pi)      #     [[3.14159265 3.14159265 3.14159265]
                            #      [3.14159265 3.14159265 3.14159265]
                            #      [3.14159265 3.14159265 3.14159265]]
# 创建一个具有3个元素的常数向量
np.full(3, np.pi) #     [[3.14159265 3.14159265 3.14159265]

访问ndarry中的元素

若想访问ndarray中的元素,可以像普通列表一样对某个下标的元素进行访问,下标都是从0开始。例如:

array = np.array([1, 2, 3])
print(array[0])  # 1
print(type(array[0])) # <class 'numpy.int32'>

注意,ndarry中元素的数据类型不再是python中的int,而是numpy的int32,关于numpy的数据类型接下来会详解讲解。

数据类型

numpy支持的数据类型比Python内置的类型要多很多,基本上可以和C语言的数据类型对应上,其中部分类型对应为 Python 内置的类型。下表列举了常用 NumPy 基本类型。

名称

描述

bool_

布尔型数据类型(True 或者 False)

int_

默认的整数类型(类似于 C 语言中的 long,int32 或 int64)

intc

与 C 的 int 类型一样,一般是 int32 或 int 64

intp

用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64)

int8

字节(-128 to 127)

int16

整数(-32768 to 32767)

int32

整数(-2147483648 to 2147483647)

int64

整数(-9223372036854775808 to 9223372036854775807)

uint8

无符号整数(0 to 255)

uint16

无符号整数(0 to 65535)

uint32

无符号整数(0 to 4294967295)

uint64

无符号整数(0 to 18446744073709551615)

float_

float64 类型的简写

float16

半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位

float32

单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位

float64

双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位

complex_

complex128 类型的简写,即 128 位复数

complex64

复数,表示双 32 位浮点数(实数部分和虚数部分)

complex128

复数,表示双 64 位浮点数(实数部分和虚数部分)

numpy.dtype

numpy.dtype是NumPy中用于表示数据类型的对象。你可以通过调用numpy.dtype函数来创建一个数据类型对象,它接受一个数据类型的字符串描述作为参数。例如:

# 创建一个浮点型数据类型对象
float_dtype = np.dtype('float')
print(float_dtype)  # float64

# 创建一个布尔型数据类型对象
bool_dtype = np.dtype('bool')
print(bool_dtype)  # bool

# 创建一个字符串型数据类型对象,长度为5
string_dtype = np.dtype('S5')
print(string_dtype)  # |S5

你还可以使用np.int8np.int16np.int32np.int64np.float32np.float64等等来创建数据类型对象。还可以使用数据类型对象来创建复合数据类型,例如:

# 创建一个结构体数据类型,包含两个字段:'name'和'age'
struct_dtype = np.dtype([('name', 'S10'), ('age', 'i4')])

# 使用结构体数据类型创建数组
s = np.array([('Alice', 20), ('Bob', 30)], dtype=struct_dtype)
print(s)  # [(b'Alice', 20) (b'Bob', 30)]

# 访问数组中的字段
print(s['name'])  # [b'Alice' b'Bob']
print(s['age'])   # [20 30]

# 修改数组中的字段
s['age'] = 25
print(s)  # [(b'Alice', 25) (b'Bob', 25)]

创建数据类型对象后,可以利用它来创建数组,例如:

# 创建一个浮点型数据类型对象
float_dtype = np.dtype('float')

# 使用浮点型数据类型对象创建数组
a = np.array([1, 2, 3], dtype=float_dtype)
print(a)  # [1. 2. 3.]

# 创建一个布尔型数据类型对象
bool_dtype = np.dtype('bool')

# 使用布尔型数据类型对象创建数组
b = np.array([True, False, True], dtype=bool_dtype)
print(b)  # [ True False  True]

# 创建一个字符串型数据类型对象,长度为5
string_dtype = np.dtype('S5')

# 使用字符串型数据类型对象创建数组
c = np.array(['abc', 'def'], dtype=string_dtype)
print(c)  # [b'abc' b'def']

ndarray.dtype

为了获取数组的数据类型,可以使用ndarray.dtype属性来获取数组的数据类型,例如:

# 创建一个浮点型数组
a = np.array([1, 2, 3], dtype='float')

# 获取数组的数据类型
print(a.dtype)  # float64

若想进行数据类型转换,可以使用ndarray.astype方法来将数组的数据类型转换为另一种数据类型。例如:

# 创建一个浮点型数组
a = np.array([1, 2, 3], dtype='float')

# 获取数组的数据类型
dtype = a.dtype
print(dtype)  # float64

# 将数组的数据类型转换为整型
b = a.astype('int')
print(b)  # [1 2 3]

切片和索引

在使用ndarray对象时,你可以和普通数组一样通过切片和索引来访问其中的元素。

切片

切片是一种通过索引访问数组元素的方式,可以通过使用冒号来访问一个范围内的元素。例如,访问数组arr中第2到5个元素:

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# 使用切片访问数组中第2到5个的元素
print(arr[2:5]) # [3 4 5]

除了使用冒号来切片外,还可以使用 numpy.ix_() 函数创建一个索引对象来进行多维数组的切片。

例如:

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 使用索引对象访问第二维索引为 1 和第三维索引为 2 的元素
idx = np.ix_([1], [2])
print(arr[idx]) # [[6]]

矩阵的切片

上面介绍了一维向量的切片,如果该数组是一个矩阵,可以进行如下的切片操作

首先我们创建一个3阶单位阵

array = np.eye(3)

我们对矩阵的第一行进行切片,方法如下:

# 访问矩阵的第一行
first_row = array[0]
print(first_row)  # [1. 0. 0.]

然后我们对矩阵的第一列进行切片,方法如下:

# 访问矩阵的第一列
first_column = array[:, 0]
print(first_column)  # [1. 0. 0.]

接下来我们切掉矩阵的第一行和第一列,方法如下:

# 切掉矩阵的第一行和第一列,访问矩阵的右下角2*2的子矩阵
sub_matrix = array[1:, 1:]
print(sub_matrix)   # [[1. 0.]
                    #  [0. 1.]]

注意array[1:, 1:]中,1:中的1代表的是数量,表示切掉多少行多少列,顺序是从左往右,从上往下。

array = np.eye(5)
print(array)    # [[1. 0. 0. 0. 0.]
                #  [0. 1. 0. 0. 0.]
                #  [0. 0. 1. 0. 0.]
                #  [0. 0. 0. 1. 0.]
                #  [0. 0. 0. 0. 1.]]

print(array[2:, 1:])    # [[0. 1. 0. 0.]
                        #  [0. 0. 1. 0.]
                        #  [0. 0. 0. 1.]]

索引

索引是一种通过指定单个元素的索引来访问数组元素的方式。例如,访问数组arr中索引为7的元素:

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# 使用索引访问数组中索引为 7 的元素
print(arr[7]) # 8

索引的模式和下标一致,但是它支持更加复杂的操作,其中常用的是布尔索引和花式索引。

布尔索引:布尔索引是一种使用布尔数组来索引数组元素的方式,可以通过使用条件判断来寻找数组中的元素。例如,访问数组中值大于5的元素:

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

print(arr > 5) # [False False False False False  True  True  True  True  True]
print(arr[arr > 5]) # [ 6  7  8  9 10]

花式索引:花式索引是一种使用整数数组来索引数组元素的方式,可以使用列表访问数组中多个不同索引的元组。例如,访问数组中索引为[3, 1, 4]的元素:

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(arr[[3, 1, 4]]) # [4 2 5]

广播(Broadcast)

广播是 NumPy 中的一种强大的功能,它允许在不同形状的数组之间进行数学运算。广播会自动复制小数组以匹配大数组的形状。这样,就可以在不同形状的数组之间执行数学运算。

举个例子:

a = np.array([1, 2, 3])
b = 2

# 广播:b 变成 [2, 2, 2]
c = a + b
print(c) # [3 4 5]

也可以用于多维数组的广播。例如:

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([2, 3, 4])

# 广播:b 变成 [[2, 3, 4], [2, 3, 4]]
c = a + b
print(c) # [[ 3  5  7]
        #  [ 6  8 10]]

可以看到,即使b的维度与a不对应,a也可以与b进行运算。

使用广播,低维度数组的数量需要和高维度数组的列数量对应。上面的多维数组的例子,如果将b的数组换为b = np.array([2, 3]),则会报如下错误:

ValueError: operands could not be broadcast together with shapes (2,3) (2,) 

也就是说,a的列数量为3,b的列数量2,无法进行广播。

字符串操作

精确匹配

如果我们想要寻找字符串数组的某一个字符,我们可以使用布尔索引进行精确查找,方法如下:

str_array = np.array(['Hello', ' World!', ' How are you?'])

print(str_array == "Hello") # [ True False False]
print(str_array[str_array == "Hello"]) # ['Hello']

模糊匹配

如果我们想要寻找字符串数组的某一些字符,我们可以使用字符串函数numpy.char.find(array, sub)寻找对应的字符,并且使用布尔索引返回对应的元素,方法如下:

str_array = np.array(['Hello', ' World!', ' How are you?'])

print(np.char.find(str_array, "l") > 0) # [ True  True False]
print(str_array[np.char.find(str_array, "l") > 0]) # ['Hello' ' World!']

字符串函数

numpy中有许多字符串函数可以用于处理数组中的字符串。其中一些常用的字符串函数包括:

函数

作用

numpy.char.find(a, sub)

寻找数组中包含该字符/字符串的元素,并返回下标

numpy.char.add(x1, x2)

对两个数组的逐个字符串元素进行连接

numpy.char.multiply(a, i)

返回按元素多重连接后的字符串

numpy.char.replace(a, old, new)

使用新字符串替换字符串中的所有子字符串

numpy.char.center(a, width)

居中字符串

numpy.char.capitalize(a)

将字符串第一个字母转换为大写

numpy.char.title(a)

将字符串的每个单词的第一个字母转换为大写

numpy.char.lower(a)

数组元素转换为小写

numpy.char.upper(a)

数组元素转换为大写

numpy.char.split(a)

指定分隔符对字符串进行分割,并返回数组列表

numpy.char.splitlines(a)

返回元素中的行列表,以换行符分割

numpy.char.strip(a)

移除元素开头或者结尾处的特定字符

numpy.char.join(sep, seq)

通过指定分隔符来连接数组中的元素

这些函数都可以用于处理数组中的字符串,并返回修改后的字符串数组。

例如:

str_array = np.array(['Hello', ' World!', ' How are you?'])
print(np.char.upper(str_array)) # ['HELLO' ' WORLD!' ' HOW ARE YOU?']

数学运算

为了执行一些数学运算,numpy提供了非常多的用在数学运算中的函数。

运算函数

numpy提供了一组用于执行算术运算的函数。需要注意的是数组必须具有相同的形状或符合数组广播规则。其中一些常用的函数包括:

函数

作用

numpy.add(x1, x2)

对两个数组中对应元素执行加法运算

numpy.subtract(x1, x2)

对两个数组中对应元素执行减法运算

numpy.multiply(x1, x2)

对两个数组中对应元素执行乘法运算

numpy.divide(x1, x2)

对两个数组中对应元素执行除法运算

numpy.power(x1, x2)

对两个数组中对应元素执行幂运算

numpy.remainder(x1, x2)

对两个数组中对应元素执行取模运算

numpy.mod(x1, x2)

对两个数组中对应元素执行取模运算

numpy.maximum(x1, x2)

对两个数组中对应元素执行取最大值运算

numpy.minimum(x1, x2)

对两个数组中对应元素执行取最小值运算

这些函数都可以用于处理数组中的数字,并返回计算结果。

例如:

arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([5, 4, 3, 2, 1])
print(np.add(arr1, arr2)) 
# [6 6 6 6 6]

数学函数

numpy提供了许多用于操作数组和矩阵的数学函数,包括三角函数,算术运算的函数,复数处理函数等。以下是一些常用的 NumPy 数学函数:

函数

作用

numpy.abs(x)

计算数组中所有元素的绝对值

numpy.sqrt(x)

计算数组中所有元素的平方根

numpy.exp(x)

计算数组中所有元素的指数

numpy.sin(x)

计算数组中所有元素的正弦

numpy.cos(x)

计算数组中所有元素的余弦

numpy.tan(x)

计算数组中所有元素的正切

numpy.arcsin(x)

计算数组中所有元素的反正弦

numpy.arccos(x)

计算数组中所有元素的反余弦

numpy.arctan(x)

计算数组中所有元素的反正切

numpy.log(x)

计算数组中所有元素的自然对数

numpy.log10(x)

计算数组中所有元素的以 10 为底的对数

这些函数都可以用于处理数组中的数字,并返回计算结果。例如:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(np.sqrt(arr)) 
# [ 1.          1.41421356  1.73205081  2.          2.23606798]

不仅如此,numpy提供了一组用于执行更复杂的数学运算的函数。其中一些常用的函数包括:

函数

作用

numpy.linalg

这个模块包含了线性代数的一些函数,例如计算矩阵的逆矩阵,行列式,特征值和特征向量。

numpy.fft

这个模块包含了快速傅里叶变换的函数,可以用于进行频域分析。

numpy.polynomial

这个模块包含了多项式函数,可以用来求解多项式的根,积,差,导数和积分。

numpy.random

这个模块包含了生成随机数的函数,可以用于生成随机数组,随机数生成器等。

例如,使用 numpy.fft.fft() 函数对数组进行快速傅里叶变换:

x = np.array([1, 2, 3, 4])
y = np.fft.fft(x)
print(y)

线性代数

NumPy 提供了一组用于线性代数运算的函数。其中一些常用的函数包括:

函数

作用

numpy.dot(a, b)

数组内积

numpy.vdot(a, b)

向量内积

numpy.inner(a, b)

向量内积

numpy.matmul(x1, x2)

矩阵乘积

numpy.linalg.inv(a)

计算矩阵的逆矩阵

numpy.linalg.solve(a, b)

解线性方程组

numpy.linalg.eig(a)

计算矩阵的特征值和特征向量

numpy.linalg.eigh(a)

计算实对称矩阵的特征值和特征向量

numpy.linalg.eigvalsh(a)

计算实对称矩阵的特征值

例如,可以使用numpy.linalg.inv()函数计算矩阵的逆矩阵:

import numpy as np
a = np.array([[1, 2], [3, 4]])
b = np.linalg.inv(a)
print(b)

或使用numpy.linalg.solve()函数来求解线性方程组:

import numpy as np
a = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])
x = np.linalg.solve(a, b)
print(x)

统计函数

NumPy 提供了一组用于统计分析的函数,用于从数组中查找最小元素,最大元素,百分位标准差和方差等。其中一些常用的函数包括:

函数

作用

numpy.mean(a)

计算数组中元素的平均值

numpy.median(a)

计算数组中元素的中位数

numpy.std(a)

计算数组中元素的标准差

numpy.var(a)

计算数组中元素的方差

numpy.min(a)

计算数组中元素的最小值

numpy.max(a)

计算数组中元素的最大值

numpy.argmin(a)

找到数组中最小值的索引

numpy.argmax(a)

找到数组中最大值的索引

numpy.percentile(a)

计算数组中给定百分位数的值

numpy.histogram(a)

计算数组中元素的直方图

这些函数都可以用于处理数组中的数字,并返回计算结果。

例如:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(np.mean(arr)) 
# 3.0

排序、条件刷选函数

NumPy 提供了多种排序的方法。 这些排序函数实现不同的排序算法,每个排序算法的特征在于执行速度,最坏情况性能,所需的工作空间和算法的稳定性。

其中一些常用的函数包括:

函数

作用

numpy.sort(a)

对数组进行排序

numpy.argsort(a)

计算数组中元素的索引排序

numpy.argmax(a)

找到数组中最大值的索引

numpy.argmin(a)

找到数组中最小值的索引

numpy.where(condition)

返回满足条件的元素索引

numpy.extract(condition, arr)

提取满足条件的元素

这些函数都可以用于处理数组中的数字,并返回计算结果。

例如:

import numpy as np
​
arr = np.array([1, 4, 2, 5, 3])
print(np.sort(arr)) 
# [1 2 3 4 5]
​
condition = arr > 2
new_arr = np.extract(condition, arr)
print(new_arr)
# [4, 5, 3]
文章作者: Vsoapmac
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 soap的会员制餐厅
数据分析 人工智能 数据分析 数据清洗
喜欢就支持一下吧