大家好,NumPy是Python数据科学生态中的核心编程库。对于Python开发者,精通NumPy是探索数据奥秘的关键。本文将介绍35个NumPy核心方法,帮助大家快速掌握这一强大工具。
使用NumPy库之前,首先需要进行导入,在Python中,通常将numpy
简称为np
。同时,考虑到数据处理的需要,pandas
库也要一并导入。
import numpy as np
import pandas as pd
以下是创建NumPy数组的最常见方法:
1.从Python列表
要将Python列表转换为NumPy数组,请使用np.array()
方法:
a = [1, 2, 3]
np.array(a)
可以使用Python中可用的type
方法来验证创建的对象的数据类型:
a = [1, 2, 3]
type(np.array(a))
在上面的演示中,创建了一个一维数组。
然而,也可以使用方法np.array()
,使用列表创建多维 NumPy 数组:
a = [[1,2,3], [4,5,6]]
np.array(a)
要创建具有特定数据类型的NumPy数组,请通过dtype
参数:
a = [[1,2,3], [4,5,6]]
np.array(a, dtype = np.float32)
2.创建填充零的NumPy数组
创建一个填充零的NumPy数组是很常见的,可以通过使用NumPy中的np.zeros()
方法实现,如下所示:
np.zeros(5)
对于多维NumPy数组:
np.zeros((2, 3))
3.创建填充1的NumPy数组
如果想创建一个填充1的数组,用np.ones()
方法:
np.ones((2, 3))
4.创建单位NumPy数组
在单位矩阵中,对角线填充有“1”,除了对角线之外的所有条目都是“0”,如下所示:
使用np.eye()
方法创建单位矩阵:
np.eye(3)
5.创建具有特定步骤的等间距NumPy数组
要在给定区间内生成等间距的值,请使用np.arange()
方法:
-
从
start=0
开始到stop=10
为止,每隔step=1
生成一个值:
np.arange(10)
-
从
start=5
开始到stop=11
为止,每隔step=1
生成一个值:
np.arange(5, 11)
-
从
start=5
开始到step=11
为止,每隔step=2
生成一个值:
np.arange(5, 11, 2)
stop
值不包括在最终数组中,默认情况下,step=1
。
6.创建具有特定数组大小的等间距NumPy数组
这类似于上面讨论的np.arange()
,但使用np.linspace()
,您可以在区间内生成num
个数字,这些数字是均匀间隔的。
np.linspace(start = 10, stop = 20, num = 5)
7.生成随机整数数组
使用np.random.randint()
方法:
np.random.randint(low = 5, high = 16, size = 5)
8.生成随机浮点样本
用np.random.random()
方法:
np.random.random(size = 10)
9.从Pandas Series生成NumPy数组
如果想将Pandas系列转换为NumPy数组,可以使用np.array()
或np.asarray()
方法:
s = pd.Series([1,2,3,4], name = "col")
np.array(s)
s = pd.Series([1,2,3,4], name = "col")
np.asarray(s)
接下来,介绍一些最常用的NumPy数组操作方法。
10.NumPy数组的形状
可以使用NumPy数组的ndarray.shape
属性或np.shape()
方法确定NumPy数组的形状,如下所示:
a = np.ones((2, 3))
print("Shape of the array - Method 1:", np.shape(a))
print("Shape of the array - Method 2:", a.shape)
11.重塑NumPy数组
重塑是指在不改变其数据的情况下给NumPy数组一个新的形状。
可以使用np.reshape()
方法改变形状:
a = np.arange(10)
a.reshape((2, 5))
12.转置NumPy数组
如果想转置NumPy数组,可以使用np.transpose()
方法或ndarray.T
,如下所示:
a = np.arange(12).reshape((6, 2))
a.transpose()
a = np.arange(12).reshape((6, 2))
a.T
13.连接多个NumPy数组以形成一个NumPy数组
使用np.concatenate()
方法连接一系列数组并获得一个新的NumPy数组:
## 按行连接
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
## 按列连接
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b.T), axis=1)
## 连接以生成一维NumPy数组
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=None)
axis=0
与np.vstack()
相同,axis=1
与np.hstack()
相同。
14.展平NumPy数组
如果想将整个NumPy数组压缩成单一维度,可以使用ndarray.flatten()
方法,如下所示:
a = np.array([[1,2], [3,4]])
a.flatten()
15.NumPy数组中的唯一元素
要确定NumPy数组中的唯一元素,用np.unique()
方法,如下所示:
a = np.array([[1, 2], [2, 3]])
np.unique(a)
## 返回唯一行
a = np.array([[1, 2, 3], [1, 2, 3], [2, 3, 4]])
np.unique(a, axis=0)
## 返回唯一列
a = np.array([[1, 1, 3], [1, 1, 3], [1, 1, 4]])
np.unique(a, axis=1)
16.挤压NumPy数组
如果想从NumPy数组中移除长度为一的轴,请用np.squeeze()
方法。这在下面进行了说明:
x = np.array([[[0], [1], [2]]])
>>> x.shape
(1, 3, 1)
np.squeeze(x).shape
17.将NumPy数组转换为Python列表
要从NumPy数组获取Python列表,请用ndarry.tolist()
方法,如下所示:
a = np.array([[1, 1, 3], [1, 1, 3], [1, 1, 4]])
a.tolist()
NumPy数组支持丰富的元素级数学运算,这些运算可以对数组中的每个元素单独进行。以下是一些在NumPy数组上应用最为常见的数学函数:
18.三角函数
a = np.array([1,2,3])
print("Trigonometric Sine :", np.sin(a))
print("Trigonometric Cosine :", np.cos(a))
print("Trigonometric Tangent:", np.tan(a))
19.舍入函数
-
使用
np.floor()
方法返回元素级的向下舍入。 -
使用
np.ceil()
方法返回元素级的向上舍入。 -
使用
np.rint()
方法四舍五入到最近的整数。
>>> a = np.linspace(1, 2, 5)
array([1. , 1.25, 1.5 , 1.75, 2. ])
>>> np.floor(a)
array([1., 1., 1., 1., 2.])
>>> np.ceil(a)
array([1., 2., 2., 2., 2.])
>>> np.rint(a)
array([1., 1., 2., 2., 2.])
-
使用
np.round_()
方法四舍五入到给定的小数位数:
a = np.linspace(1, 2, 7)
np.round_(a, 2) # 保留两位小数
20.指数和对数
-
使用
np.exp()
方法计算元素级的指数。 -
使用
np.log()
方法计算元素级的自然对数。
>>> a = np.arange(1, 6)
array([1, 2, 3, 4, 5])
>>> np.exp(a).round(2)
array([ 2.72, 7.39, 20.09, 54.6 , 148.41])
>>> np.log(a).round(2)
array([0. , 0.69, 1.1 , 1.39, 1.61])
21.求和
使用np.sum()
方法计算数组元素的总和:
a = np.array([[1, 2], [3, 4]])
>>> np.sum(a)
10
>>> np.sum(a, axis = 0)
array([4, 6])
>>> np.sum(a, axis = 1)
array([3, 7])
22.乘积
使用np.prod()
方法计算数组元素的乘积:
a = np.array([[1, 2], [3, 4]])
>>> np.prod(a)
24
>>> np.prod(a, axis = 0)
array([3, 8])
>>> np.sum(a, axis = 1)
array([2, 12])
23.平方根
使用np.sqrt()
方法计算数组元素的平方根:
a = np.array([[1, 2], [3, 4]])
np.sqrt(a)
矩阵和向量运算:
24.点积
想计算两个NumPy数组的点积,使用np.dot()
方法:
a = np.array([[1, 2], [3, 4]])
b = np.array([[1, 1], [1, 1]])
np.dot(a, b)
25.矩阵乘积
要计算两个NumPy数组的矩阵乘积,使用np.matmul()
或Python中的@
运算符:
a = np.array([[1, 2], [3, 4]])
b = np.array([[1, 1], [1, 1]])
>>> np.matmul(a, b)
array([[3, 3],
[7, 7]])
>>> a@b
array([[3, 3],
[7, 7]])
26.向量范数
向量范数是一组用于测量向量长度的函数。
使用np.linalg.norm()
方法找到矩阵或向量范数:
a = np.arange(-4, 5)
>>> np.linalg.norm(a) ## L2范数
7.745966692414834
>>> np.linalg.norm(a, 1) ## L1范数
20.0
排序方法:
27.对NumPy数组进行排序
要就地排序数组,使用ndarray.sort()
方法。
a = np.array([[1,4],[3,1]])
>>> np.sort(a) ## 按行排序
array([[1, 4],
[1, 3]])
>>> np.sort(a, axis=None) ## 对展平后的数组进行排序
array([1, 1, 3, 4])
>>> np.sort(a, axis=0) ## 按列排序
array([[1, 1],
[3, 4]])
28.排序NumPy数组中的索引顺序
要返回将数组排序的索引顺序,请使用np.argsort()
方法:
x = np.array([3, 1, 2])
np.argsort(x)
搜索方法:
29.对应最大值的索引
要返回沿轴的最大值的索引,请使用np.argmax()
方法,如下所示:
>>> a = np.random.randint(1, 20, 10).reshape(2,5)
array([[15, 13, 10, 1, 18],
[14, 19, 19, 17, 8]])
>>> np.argmax(a) ## 在展平后的数组中寻找最大值的索引
6
>>> np.argmax(a, axis=0) ## 按列寻找每列最大值的索引
array([0, 1, 1, 1, 0])
>>> np.argmax(a, axis=1) ## 按行寻找每行最大值的索引
array([4, 1])
要在非展平数组中找到索引,可以这样做:
ind = np.unravel_index(np.argmax(a), a.shape)
ind
30.对应最小值的索引
类似地,如果想返回沿轴的最小值的索引,请使用np.argmin()
方法,如下所示:
>>> a = np.random.randint(1, 20, 10).reshape(2,5)
array([[15, 13, 10, 1, 18],
[14, 19, 19, 17, 8]])
>>> np.argmin(a) ## 在展平后的数组中寻找最小值的索引
3
>>> np.argmin(a, axis=0) ## 按列寻找每列最小值的索引
array([1, 0, 0, 0, 1])
>>> np.argmin(a, axis=1) ## 按行寻找每行最小值的索引
array([3, 4])
31.基于条件的搜索
想根据条件在两个数组之间进行选择,使用np.where()
方法,如下所示:
>>> a = np.random.randint(-10, 10, 10)
array([ 2, -3, 6, -3, -8, 4, -6, -2, 6, -4])
>>> np.where(a < 0, 0, a)
array([2, 0, 6, 0, 0, 4, 0, 0, 6, 0])
"""
if element < 0:
return 0
else:
return element
"""
32.非零元素的索引
要确定NumPy数组中非零元素的索引,请使用np.nonzero()
方法:
a = np.array([[3, 0, 0], [0, 4, 0], [5, 6, 0]])
np.nonzero(a)
接下来看看计算NumPy数组上的标准统计方法。
33.平均值
要找到NumPy数组中值的平均值沿轴,使用np.mean()
方法,如下所示:
a = np.array([[1, 2], [3, 4]])
>>> np.mean(a)
2.5
>>> np.mean(a, axis = 1) ## 沿行轴计算平均值
array([1.5, 3.5])
>>> np.mean(a, axis = 0) ## 沿列轴计算平均值
array([2., 3.])
34.中位数
要计算NumPy数组的中位数,使用np.median()
方法。
a = np.array([[1, 2], [3, 4]])
>>> np.median(a)
2.5
>>> np.median(a, axis = 1) ## 沿行轴求中位数
array([1.5, 3.5])
>>> np.median(a, axis = 0) ## 沿列轴求中位数
array([2., 3.])
35.标准差
要计算NumPy数组的标准差沿指定数组,使用np.std()
方法。
a = np.array([[1, 2], [3, 4]])
>>> np.std(a)
1.118033988749895
>>> np.std(a, axis = 1) ## 沿行轴计算标准差
array([0.5, 0.5])
>>> np.std(a, axis = 0) ## 沿列轴计算标准差
array([1., 1.])