一、说明
NumPy(或Numeric Python)是每个数据科学和机器学习项目的核心。
整个数据驱动的生态系统在某种程度上依赖于NumPy及其核心功能。这使它成为 Python 有史以来最重要和改变游戏规则的库之一。
鉴于NumPy由于其无与伦比的潜力而在工业界和学术界具有广泛的适用性,因此对于python程序员来说,熟悉其方法和语法是极其必要的。
但是,如果您是新手并试图牢牢掌握 NumPy 库,那么如果您从 NumPy 的官方文档开始,一开始事情可能会显得非常令人生畏和不知所措。
我自己去过那里,这个博客旨在帮助您开始使用NumPy。换句话说,在这个博客中,我将回顾我使用NumPy的经验,并分享我几乎一直使用的45种特定方法。
您可以在此处参考本文的代码。
二、Numpy使用范例
2.1 导入库
当然,如果你想使用NumPy库,你应该导入它。
import numpy as np
import pandas as pd
这里广泛采用的约定是将别名设置为np 。我们还将在这里和那里使用pandas,所以让我们也导入它。
2.2 (1–10) NumPy 数组创建方法
以下是创建 NumPy 数组的一些最常见方法。
#1)来自python列表
要将 python 列表转换为 NumPy 数组,请使用以下方法:np.array()
a = [1, 2, 3]
np.array(a)
我们可以验证使用 Python 中可用的方法创建的对象的数据类型:type
a = [1, 2, 3]
type(np.array(a))
在上面的演示中,我们创建了一个一维数组。
一维数组(图片来自作者)
但是,我们也可以使用列表列表创建一个多维 NumPy 数组:np.array()
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)
>>
array([0., 0., 0., 0., 0.])
对于多维 NumPy 数组:
np.zeros((2, 3))
>>
array([[0., 0., 0.],
[0., 0., 0.]])
#3)创建一个数字数组
如果要创建一个填充 1 的数组,请改用该方法代替零:np.ones()
np.ones((2, 3))
>>
array([[1., 1., 1.],
[1., 1., 1.]])
#4)创建一个身份数字数组
在单位矩阵中,对角线填充“1”,除对角线外的所有条目均为“0”,如下所示:
身份矩阵(图片来自作者)
使用该方法创建单位矩阵。np.eye()
np.eye(3)
>>
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
#5)使用特定步骤创建一个等间距的NumPy数组
要在给定间隔内生成等间距值,请使用以下方法:np.arange()
- 使用 生成从 到 的值:
start=0
stop=10
step=1
np.arange(10)
>>array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
- 使用 生成从 到 的值:
start=5
stop=11
step=1
np.arange(5, 11)
>>array([ 5, 6, 7, 8, 9, 10])
- 生成 with 的值。
start=5
step=11
step=2
np.arange(5, 11, 2)
>>array([5, 7, 9])
该值不包含在最终数组中,默认情况下,.stop
step=1
#6)创建一个具有特定数组大小的等间距NumPy数组
这与上面讨论的类似,但使用 ,您可以在一个间隔内生成数字,并且数字是均匀分布的。np.arange()
np.linspace()
num
np.linspace(start = 10, stop = 20, num = 5)
>>array([10. , 12.5, 15. , 17.5, 20. ])
#7–8) 生成一个随机的 NumPy 数组
- 若要生成整数的随机数组,请使用以下方法:
np.random.randint()
np.random.randint(low = 5, high = 16, size = 5)
>>array([12, 9, 8, 8, 13])
- 但是,要生成随机浮点样本,请使用以下方法:
np.random.random()
np.random.random(size = 10)
>> array([0.13011502, 0.13624477, 0.63199788, 0.62565385, 0.47521946,
0.31121428, 0.11785969, 0.49575226, 0.77330761, 0.77047183])
#9–10) 从pandas系列生成 NumPy 数组
如果要将熊猫系列转换为 NumPy 数组,可以使用 or 方法之一:np.array()
np.asarray()
s = pd.Series([1,2,3,4], name = "col")
np.array(s)
>> array([1, 2, 3, 4])
s = pd.Series([1,2,3,4], name = "col")
np.asarray(s)
>> array([1, 2, 3, 4])
11–21) NumPy 数组操作方法
接下来,我们将讨论一些最广泛使用的方法来操作 NumPy 数组。
#11) 数字数组的形状
您可以使用 NumPy 数组的属性方法确定 NumPy 数组的形状,如下所示:np.shape()
ndarray.shape
a = np.ones((2, 3))
print("Shape of the array - Method 1:", np.shape(a))
print("Shape of the array - Method 2:", a.shape)
>>
Shape of the array - Method 1: (2, 3)
Shape of the array - Method 2: (2, 3)
#12) 重塑 NumPy 数组
重塑是指在不更改其数据的情况下为 NumPy 数组提供新形状。
您可以使用以下方法更改形状:np.reshape()
a = np.arange(10)
a.reshape((2, 5))
>> array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
#13–14) 转置 NumPy 数组
如果要转置 NumPy 数组,可以使用该方法或如下所示:np.transpose()
ndarray.T
a = np.arange(12).reshape((6, 2))
a.transpose()
>>
array([[ 0, 2, 4, 6, 8, 10],
[ 1, 3, 5, 7, 9, 11]])
a = np.arange(12).reshape((6, 2))
a.T
>>
array([[ 0, 2, 4, 6, 8, 10],
[ 1, 3, 5, 7, 9, 11]])
#15–17) 连接多个 NumPy 数组以形成一个 NumPy 数组
您可以使用该方法联接数组序列并获取新的 NumPy 数组:np.concatenate()
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
>>
array([[1, 2],
[3, 4],
[5, 6]])
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b.T), axis=1)
>>
array([[1, 2, 5],
[3, 4, 6]])
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=None)
>>
array([1, 2, 3, 4, 5, 6])
axis=0
与 相同。np.vstack()
axis=1
与 相同。np.hstack()
#18) 扁平化数字数组
如果要将整个 NumPy 数组折叠到单个维度中,可以使用如下所示的方法:ndarray.flatten()
a = np.array([[1,2], [3,4]])
a.flatten()
>>
array([1, 2, 3, 4])
#19) 数字数组的独特元素
若要确定 NumPy 数组的唯一元素,请使用如下所示的方法:np.unique()
a = np.array([[1, 2], [2, 3]])
np.unique(a)
>>
array([1, 2, 3])
a = np.array([[1, 2, 3], [1, 2, 3], [2, 3, 4]])
np.unique(a, axis=0)
>>
array([[1, 2, 3],
[2, 3, 4]])
a = np.array([[1, 1, 3], [1, 1, 3], [1, 1, 4]])
np.unique(a, axis=1)
>>
array([[1, 3],
[1, 3],
[1, 4]])
#20) 挤压一个数字数组
如果要从 NumPy 数组中删除长度为 1 的轴,请使用该方法。如下所示:np.squeeze()
x = np.array([[[0], [1], [2]]])
>>> x.shape
(1, 3, 1)
np.squeeze(x).shape
>>
(3,)
#21) 将 NumPy 数组转换为 Python 列表
要从 NumPy 数组中获取 python 列表,请使用如下所示的方法:ndarry.tolist()
a = np.array([[1, 1, 3], [1, 1, 3], [1, 1, 4]])
a.tolist()
>>
[[1, 1, 3], [1, 1, 3], [1, 1, 4]]
22-33) NumPy 数组的数学运算
NumPy提供了各种各样的元素数学函数,你可以应用于NumPy数组。您可以在此处阅读所有可用的数学运算。下面,让我们讨论一些最常用的。
#22–24) 三角函数
a = np.array([1,2,3])
print("Trigonometric Sine :", np.sin(a))
print("Trigonometric Cosine :", np.cos(a))
print("Trigonometric Tangent:", np.tan(a))
>>
Trigonometric Sine : [0.84147098 0.90929743 0.14112001]
Trigonometric Cosine : [ 0.54030231 -0.41614684 -0.9899925 ]
Trigonometric Tangent: [ 1.55740772 -2.18503986 -0.14254654]
#25–28) 舍入函数
- 使用该方法返回逐元素楼层。
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) # 2 decimal places
>>
array([1. , 1.17, 1.33, 1.5 , 1.67, 1.83, 2. ])
#29–30) 指数和对数
- 使用该方法计算元素指数。
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])
#31–32) 总和和乘积
- 使用该方法计算数组元素的总和:
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])
- 使用该方法计算数组元素的乘积:
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])
#33) 平方根
使用 np.sqrt() 方法计算数组元素的平方根:
a = np.array([[1, 2], [3, 4]])
np.sqrt(a)
>>
array([[1. , 1.41421356],
[1.73205081, 2. ]])
34-36)矩阵和向量运算
#34) 点积
如果要计算两个 NumPy 数组的点积,请使用以下方法:np.dot()
a = np.array([[1, 2], [3, 4]])
b = np.array([[1, 1], [1, 1]])
np.dot(a, b)
>>
array([[3, 3],
[7, 7]])
#35) 矩阵产品
要计算两个 NumPy 数组的矩阵乘积,请使用 Python 中的 or 运算符:np.matmul()
@
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]])
注意: 在这种情况下,和 的输出是相同的,但它们可能会有很大不同。您可以在此处阅读它们的差异。
np.matmul()
np.dot()
#36) 矢量范数
向量范数表示一组用于测量向量长度的函数。我已经有一篇关于向量范数的帖子,您可以在下面阅读:
机器学习中的向量规范
p范数指南。
towardsdatascience.com
a = np.arange(-4, 5)
>>> np.linalg.norm(a) ## L2 Norm
7.745966692414834
>>> np.linalg.norm(a, 1) ## L1 Norm
20.0
使用该方法查找矩阵或向量范数:np.linalg.norm()
37-38) 排序方法
#37) 对数字数组进行排序
若要就地对数组进行排序,请使用该方法。ndarray.sort()
a = np.array([[1,4],[3,1]])
>>> np.sort(a) ## sort based on rows
array([[1, 4],
[1, 3]])
>>> np.sort(a, axis=None) ## sort the flattened array
array([1, 1, 3, 4])
>>> np.sort(a, axis=0) ## sort based on columns
array([[1, 1],
[3, 4]])
#38) 排序的 NumPy 数组中的索引顺序
若要返回将对数组进行排序的索引的顺序,请使用以下方法:np.argsort()
x = np.array([3, 1, 2])
np.argsort(x)
>>
array([1, 2, 0])
39-42) 搜索方法
#39) 对应于最大值的指数
要返回沿轴的最大值的索引,请使用如下所示的方法: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) ## index in a flattend array
6
>>> np.argmax(a, axis=0) ## indices along columns
array([0, 1, 1, 1, 0])
>>> np.argmax(a, axis=1) ## indices along rows
array([4, 1])
要在非平展数组中查找索引,可以执行以下操作:
ind = np.unravel_index(np.argmax(a), a.shape)
ind
>>
(1, 1)
#40) 对应于最小值的指数
同样,如果要返回沿轴的最小值的索引,请使用如下所示的方法: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) ## index in a flattend array
3
>>> np.argmin(a, axis=0) ## indices along columns
array([1, 0, 0, 0, 1])
>>> np.argmin(a, axis=1) ## indices along rows
array([3, 4])
#41) 根据条件搜索
如果要根据条件在两个数组之间进行选择,请使用如下所示的方法: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
"""
#42) 非零元素索引
若要确定 NumPy 数组中非零元素的索引,请使用以下方法:np.nonzero()
a = np.array([[3, 0, 0], [0, 4, 0], [5, 6, 0]])
np.nonzero(a)
>>
(array([0, 1, 2, 2]), array([0, 1, 0, 1]))
43-45)统计方法
接下来,让我们看一下在 NumPy 数组上计算标准统计信息的方法。您可以在此处找到NumPy支持的所有统计技术。
#43) 平均值
要沿轴查找 NumPy 数组中值的平均值,请使用如下所示的方法:np.mean()
a = np.array([[1, 2], [3, 4]])
>>> np.mean(a)
2.5
>>> np.mean(a, axis = 1) ## along the row axis
array([1.5, 3.5])
>>> np.mean(a, axis = 0) ## along the column axis
array([2., 3.])
#44) 中位数
若要计算 NumPy 数组的中位数,请使用该方法。np.median()
a = np.array([[1, 2], [3, 4]])
>>> np.median(a)
2.5
>>> np.median(a, axis = 1) ## along the row axis
array([1.5, 3.5])
>>> np.median(a, axis = 0) ## along the column axis
array([2., 3.])
#45) 标准偏差
若要计算 NumPy 数组沿指定数组的标准偏差,请使用该方法。np.std()
a = np.array([[1, 2], [3, 4]])
>>> np.std(a)
1.118033988749895
>>> np.std(a, axis = 1) ## along the row axis
array([0.5, 0.5])
>>> np.std(a, axis = 0) ## along the column axis
array([1., 1.])