Numpy简介
NumPy库的一些主要特点:
- NumPy的核心数据结构是数组对象(ndarray),可以快速高效地对数组执行各种数学运算操作。
- NumPy的数组对象是同质性的,即数组中所有元素的数据类型必须相同。
- NumPy的数组对象可以支持广播功能,即在执行某些操作时,可以将不同形状的数组自动转换为相同形状,省去了重复和冗余的代码。
- NumPy还提供了大量的数学函数和操作符,使得数学计算和科学计算变得更加简单和高效。
- NumPy的数组对象可以用于多种科学计算领域,包括图像处理、信号处理、线性代数、统计分析等。
Numpy创建数组
使用NumPy创建数组时,有多种方便的方法可供选择。以下是一些常用的数组创建方法以及相应的示例:
- 使用
np.array()
函数从Python列表或元组创建数组:
python
import numpy as np
# 从列表创建数组
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)
# 从元组创建数组
arr2 = np.array((6, 7, 8, 9, 10))
print(arr2)
输出结果:
python
[1 2 3 4 5]
[ 6 7 8 9 10]
- 使用
np.zeros()
函数创建全零数组:
python
import numpy as np
# 创建全零一维数组
arr1 = np.zeros(5)
print(arr1)
# 创建全零二维数组
arr2 = np.zeros((3, 4))
print(arr2)
输出结果:
python
Copy Code[0. 0. 0. 0. 0.]
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
- 使用
np.ones()
函数创建全一数组:
python
import numpy as np
# 创建全一一维数组
arr1 = np.ones(5)
print(arr1)
# 创建全一二维数组
arr2 = np.ones((2, 3))
print(arr2)
输出结果:
python
Copy Code[1. 1. 1. 1. 1.]
[[1. 1. 1.]
[1. 1. 1.]]
- 使用
np.arange()
函数创建指定范围的数组:
python
import numpy as np
# 创建从0到9的一维数组
arr1 = np.arange(10)
print(arr1)
# 创建从3到9的一维数组,步长为2
arr2 = np.arange(3, 10, 2)
print(arr2)
输出结果:
python
[0 1 2 3 4 5 6 7 8 9]
[3 5 7 9]
- 使用
np.linspace()
函数创建等间隔的数组:
python
import numpy as np
# 创建0到1之间的五个等间隔数值的一维数组
arr1 = np.linspace(0, 1, 5)
print(arr1)
输出结果:
python
[0. 0.25 0.5 0.75 1. ]
这些只是NumPy库中创建数组的几种常用方法,还有其他更多的方法可供使用。您可以根据自己的需求选择合适的方法来创建数组。
Numpy的广播功能
广播的规则如下:
- 如果两个数组的维数不同,则将较小数组的形状扩展为较大数组的形状,直到它们的形状相同。
- 如果两个数组在某个维度上的长度不同且其中一个数组的长度为1,则在该维度上进行广播。
- 如果两个数组在某个维度上的长度不同且两个数组的长度都不为1,则出现形状不兼容的错误。
广播功能可以通过简单的示例来理解。
python
import numpy as np
# 创建一个二维数组和一个一维数组
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([10, 20, 30])
# 使用广播将b与a中的每一行相加
c = a + b
print("a = \n", a)
print("b = ", b)
print("c = \n", c)
输出结果:
python
a =
[[1 2 3]
[4 5 6]]
b = [10 20 30]
c =
[[11 22 33]
[14 25 36]]
在此示例中,数组a
的形状为(2, 3)
,数组b
的形状为(3,)
。当执行操作a + b
时,b
数组被广播成了(2, 3)
的形状,然后两个数组相加得到数组c
,其形状也是(2, 3)
。
在处理形状不同的数组时,广播机制可以显著简化代码并提高效率。
需要注意的是,在某些情况下,广播操作可能会带来意料之外的结果,例如:
python
import numpy as np
# 创建一个一维数组和一个常数
a = np.array([1, 2, 3])
b = 10
# 使用广播将b加到a中
c = a + b
print("a = ", a)
print("b = ", b)
print("c = ", c)
输出结果:
python
a = [1 2 3]
b = 10
c = [11 12 13]
在此示例中,常数b
被视为形状为(1,)
的数组。当与形状为(3,)
的数组a
进行广播运算时,b
数组被广播成(3,)
的形状,然后进行相应的运算。这种广播行为在某些情况下可能会导致出乎意料的结果,因此需要格外小心。
总结起来,广播功能是Numpy中非常实用的一个特性,它允许我们对形状不同的数组进行运算,从而简化了代码并提高了效率。在使用广播功能时需要注意其规则,并小心处理数据类型和形状不一致的情况
Numpy常见函数
-
数学函数:
-
np.sqrt(x)
: 计算数组x中每个元素的平方根。pythonimport numpy as np x = np.array([4, 9, 16]) result = np.sqrt(x) print(result) # 输出: [2. 3. 4.]
-
np.exp(x)
: 计算数组x中每个元素的指数值。pythonimport numpy as np x = np.array([1, 2, 3]) result = np.exp(x) print(result) # 输出: [ 2.71828183 7.3890561 20.08553692]
-
np.log(x)
: 计算数组x中每个元素的自然对数。pythonimport numpy as np x = np.array([1, 10, 100]) result = np.log(x) print(result) # 输出: [0. 2.30258509 4.60517019]
-
np.log10(x)
: 计算数组x中每个元素的以10为底的对数。pythonimport numpy as np x = np.array([1, 10, 100]) result = np.log10(x) print(result) # 输出: [0. 1. 2.]
-
np.sin(x)
,np.cos(x)
,np.tan(x)
: 计算数组x中每个元素的正弦、余弦和正切值。pythonimport numpy as np x = np.array([0, np.pi/2, np.pi]) sin_result = np.sin(x) cos_result = np.cos(x) tan_result = np.tan(x) print("sin:", sin_result) # 输出: [0.0000000e+00 1.0000000e+00 1.2246064e-16] print("cos:", cos_result) # 输出: [ 1.000000e+00 6.123234e-17 -1.000000e+00] print("tan:", tan_result) # 输出: [ 0.00000000e+00 1.63312394e+16 -1.22464680e-16]
-
np.arcsin(x)
,np.arccos(x)
,np.arctan(x)
: 计算数组x中每个元素的反正弦、反余弦和反正切值。pythonimport numpy as np x = np.array([-1, 0, 1]) arcsin_result = np.arcsin(x) arccos_result = np.arccos(x) arctan_result = np.arctan(x) print("arcsin:", arcsin_result) # 输出: [-1.57079633 0. 1.57079633] print("arccos:", arccos_result) # 输出: [3.14159265 1.57079633 0. ] print("arctan:", arctan_result) # 输出: [-0.78539816 0. 0.78539816]
-
np.sinh(x)
,np.cosh(x)
,np.tanh(x)
: 计算数组x中每个元素的双曲正弦、双曲余弦和双曲正切值。pythonimport numpy as np x = np.array([0, 1, 2]) sinh_result = np.sinh(x) cosh_result = np.cosh(x) tanh_result = np.tanh(x) print("sinh:", sinh_result) # 输出: [0. 1.17520119 3.62686041] print("cosh:", cosh_result) # 输出: [1. 1.54308063 3.76219569] print("tanh:", tanh_result) # 输出: [0. 0.76159416 0.96402758]
-
-
基本运算操作符:
-
+
,-
,*
,/
: 加法、减法、乘法和除法运算符,用于数组之间的逐元素运算。pythonimport numpy as np x = np.array([1, 2, 3]) y = np.array([4, 5, 6]) add_result = x + y subtract_result = x - y multiply_result = x * y divide_result = x / y print("Addition:", add_result) # 输出: [5 7 9] print("Subtraction:", subtract_result) # 输出: [-3 -3 -3] print("Multiplication:", multiply_result) # 输出: [ 4 10 18] print("Division:", divide_result) # 输出: [0.25 0.4 0.5 ]
-
**
: 幂运算符,用于将数组的每个元素提升为指定的幂次。pythonimport numpy as np x = np.array([2, 3, 4]) exponent = 2 result = x ** exponent print(result) # 输出: [ 4 9 16]
-
np.abs(x)
: 计算数组x中每个元素的绝对值。pythonimport numpy as np x = np.array([-1, -2, 3]) result = np.abs(x) print(result) # 输出: [1 2 3]
-
np.sign(x)
: 返回数组x中每个元素的符号,大于0返回1,等于0返回0,小于0返回-1。pythonimport numpy as np x = np.array([-1, 0, 1]) result = np.sign(x) print(result) # 输出: [-1 0 1]
-
np.floor(x)
: 计算数组x中每个元素的向下取整结果。pythonimport numpy as np x = np.array([1.5, 2.7, 3.2]) result = np.floor(x) print(result) # 输出: [1. 2. 3.]
-
np.ceil(x)
: 计算数组x中每个元素的向上取整结果。pythonimport numpy as np x = np.array([1.5, 2.7, 3.2]) result = np.ceil(x) print(result) # 输出: [2. 3. 4.]
-
np.round(x)
: 计算数组x中每个元素的四舍五入结果。pythonimport numpy as np x = np.array([1.5, 2.7, 3.2]) result = np.round(x) print(result) # 输出: [2. 3. 3.]
-
-
聚合函数:
-
np.sum(x)
: 计算数组x所有元素的和。pythonimport numpy as np x = np.array([1, 2, 3]) result = np.sum(x) print(result) # 输出: 6
-
np.mean(x)
: 计算数组x所有元素的平均值。pythonimport numpy as np x = np.array([1, 2, 3]) result = np.mean(x) print(result) # 输出: 2.0
-
np.max(x)
,np.min(x)
: 计算数组x中的最大值和最小值。pythonimport numpy as np x = np.array([1, 2, 3]) max_value = np.max(x) min_value = np.min(x) print("Max:", max_value) # 输出: 3 print("Min:", min_value) # 输出: 1
-
np.std(x)
: 计算数组x所有元素的标准差。pythonimport numpy as np x = np.array([1, 2, 3]) result = np.std(x) print(result) # 输出: 0.816496580927726
-
np.var(x)
: 计算数组x所有元素的方差。pythonimport numpy as np x = np.array([1, 2, 3]) result = np.var(x) print(result) # 输出: 0.6666666666666666
-
Numpy随机数模块
-
生成随机数:
-
np.random.rand(d0, d1, ..., dn)
: 生成指定维度的[0, 1)之间均匀分布的随机数。pythonimport numpy as np # 生成一个2x3的随机数组 random_array = np.random.rand(2, 3) print(random_array)
-
np.random.randn(d0, d1, ..., dn)
: 生成指定维度的标准正态分布(平均值为0,方差为1)的随机数。pythonimport numpy as np # 生成一个2x3的随机数组 random_array = np.random.randn(2, 3) print(random_array)
-
np.random.randint(low, high=None, size=None, dtype=int)
: 生成指定范围内的整数随机数。pythonimport numpy as np # 生成一个1到10之间的整数随机数 random_number = np.random.randint(1, 11) print(random_number)
-
-
生成随机数组:
-
np.random.random(size=None)
: 生成指定形状的[0, 1)之间均匀分布的随机数组。pythonimport numpy as np # 生成一个2x3的随机数组 random_array = np.random.random((2, 3)) print(random_array)
-
np.random.randn(d0, d1, ..., dn)
: 生成指定形状的标准正态分布(平均值为0,方差为1)的随机数组。pythonimport numpy as np # 生成一个2x3的随机数组 random_array = np.random.randn(2, 3) print(random_array)
-
np.random.randint(low, high=None, size=None, dtype=int)
: 生成指定范围内的整数随机数组。pythonimport numpy as np # 生成一个2x3的随机整数数组,取值范围为1到10 random_array = np.random.randint(1, 11, size=(2, 3)) print(random_array)
-
-
随机抽样:
-
np.random.choice(a, size=None, replace=True, p=None)
: 从给定的一维数组中进行有放回或无放回抽样。pythonimport numpy as np # 从[1, 2, 3, 4, 5]中有放回地抽取3个数 random_sample = np.random.choice([1, 2, 3, 4, 5], size=3, replace=True) print(random_sample)
-
np.random.shuffle(x)
: 随机打乱数组的顺序。pythonimport numpy as np x = np.array([1, 2, 3, 4, 5]) np.random.shuffle(x) print(x)
-
np.random.permutation(x)
: 返回一个随机排列数组的副本(复制版本)。pythonimport numpy as np x = np.array([1, 2, 3, 4, 5]) random_permutation = np.random.permutation(x)
-