引言
书接上回,numpy能作为python中最受欢迎的数据处理模块,脱离不了它最核心的部件——ndarray数组。那么,我们今天就来了解一下numpy中对ndarray的常用操作。
通过阅读本篇博客,你可以:
1.掌握ndarray数组的分割
2.掌握ndarray数组的各类运算函数
一、ndarray数组的分割
通过上一篇博客的学习(6.科学计算模块Numpy(3)ndarray数组的常用操作(一)_<class 'numpy.ndarray'>-CSDN博客),我们已经掌握了ndarray数组的拼接操作。正如古语所说“阴阳并济”,有了数组的拼接,那么必然有数组的分割。
数组的分割有以下常用的方法。
1.split()
import numpy as np
np.split(arr,indices_or_sections,axis)
numpy.split()函数沿特定的轴将数组分割为子数组。
arr:被分割的数组
indices_or_sections:如果是一个整数,就用该数平均切分。如果是一个数组,则按照数组的值为索引进行切分。
axis:沿着哪个维度进行切分,默认为0,横向切分。为1时,纵向切分。
代码示例如下:
import numpy as np
#按整数平均切分
arr = np.arange(9)
split_arr = np.split(arr, 3) # 分割成3个等大小的子数组
print(split_arr) #[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
#按索引切分
arr = np.arange(9)
split_arr = np.split(arr, [2, 5]) # 在索引2和5处分割数组
print(split_arr) #[array([0, 1]), array([2, 3, 4]), array([5, 6, 7, 8])]
2.hsplit()
import numpy as np
np.hsplit(arr, indices_or_sections)
numpy.hsplit()用于将数组沿水平方向(即列方向)进行分割。它可以将多维数组分割成多个子数组,每个子数组具有相同的行数,但列数不同。
代码示例如下:
import numpy as np
#等宽分割
arr = np.arange(12).reshape(3, 4) # 创建一个3x4的二维数组
split_arr = np.hsplit(arr, 2) # 分割成2个等宽的子数组
print(split_arr)
"""[array([[0, 1],
[4, 5],
[8, 9]]),
array([[ 2, 3],
[ 6, 7],
[10, 11]])]"""
split_arr = np.hsplit(arr, [2]) # 在第2列处分割数组
print(split_arr)
"""[array([[0, 1],
[4, 5],
[8, 9]]),
array([[ 2, 3],
[ 6, 7],
[10, 11]])]"""
3.vsplit()
import numpy as np
np.vsplit(ary, indices_or_sections)
numpy.vsplit()用于将数组沿垂直方向(即行方向)进行分割。它可以将多维数组沿着行方向分割成多个子数组,每个子数组具有相同的列数,但行数不同。
代码示例如下:
import numpy as np
arr = np.arange(12).reshape(4, 3) # 创建一个4x3的二维数组
split_arr = np.vsplit(arr, 2) # 分割成2个等高的子数组
print(split_arr)
"""[array([[0, 1, 2],
[3, 4, 5]]),
array([[ 6, 7, 8],
[ 9, 10, 11]])]
"""
split_arr = np.vsplit(arr, [2]) # 在第2行处分割数组
print(split_arr)
"""[array([[0, 1, 2],
[3, 4, 5]]),
array([[ 6, 7, 8],
[ 9, 10, 11]])]
"""
二、ndarray数组的各类运算函数
1.算术函数
如果参与运算的两个对象都是ndarray,且形状相同。那么我们就可以对位彼此之间进行(+ - * /)运算。numpy中的算术函数包括简单的加减乘除:add(),subtract(),multiply(),divide()。
①add()
import numpy as np
np.add(x1, x2, out=None, where=True)
numpy.add()函数用于对两个数组进行逐个元素的加法运算。x1和x2是输入的两个数组。out是用来提供存储结果的变量,默认是None。where用于控制哪些元素进行计算,默认是True,即所有元素都参与计算。
代码示例如下:
import numpy as np
# 基本加法
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
result = np.add(a, b)
print(result) # 输出: [5 7 9]
# 使用 out 参数
c = np.array([10, 20, 30])
d = np.array([1, 2, 3])
out_array = np.empty_like(c)
np.add(c, d, out=out_array)
print(out_array) # 输出: [11 22 33]
# 使用 where 参数
e = np.array([1, 2, 3, 4])
f = np.array([10, 20, 30, 40])
result_where = np.add(e, f, where=[True, False, True, False])
print(result_where) # 输出: [11 0 33 0]
②subtract()
import numpy as np
np.subtract(x1, x2, out=None, where=True)
numpy.subtract()函数用于对两个数组进行逐个元素的减法运算。功能与numpy.add()类似,不过是进行减法操作。x1是被减数数组,x2是减数数组。
代码示例如下:
import numpy as np
# 基本减法
a = np.array([10, 20, 30])
b = np.array([1, 2, 3])
result = np.subtract(a, b)
print(result) # 输出: [ 9 18 27]
③multiply()
import numpy as np
np.multiply(x1, x2, out=None, where=True)
numpy.multiply()函数用于对两个数组进行逐个元素的乘法运算。它的功能与numpy.add()和numpy.subtract()类似,不过是进行乘法操作。
代码示例如下:
import numpy as np
# 基本乘法
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
result = np.multiply(a, b)
print(result) # 输出: [ 4 10 18]
④divide()
import numpy as np
np.divide(x1, x2, out=None, where=True)
numpy.divide()函数用于对两个数组进行逐个元素的除法运算。它的功能与以上三个算数函数类似,不过是进行除法运算。
代码示例如下:
import numpy as np
# 基本除法
a = np.array([10, 20, 30])
b = np.array([2, 4, 5])
result = np.divide(a, b)
print(result) # 输出: [ 5. 5. 6.]
# 使用 out 参数
c = np.array([100, 200, 300])
d = np.array([10, 20, 30])
out_array = np.empty_like(c, dtype=float)
np.divide(c, d, out=out_array)
print(out_array) # 输出: [10. 10. 10.]
# 使用 where 参数
e = np.array([10, 20, 30, 40])
f = np.array([2, 0, 5, 0])
result_where = np.divide(e, f, where=f != 0)
print(result_where) # 输出: [ 5. 0. 6. 0.]
2.数学函数
numpy模块中提供了大量的数学函数,支持各种常见的数学运算。这些函数非常高效,能够处理大规模数组和矩阵运算。以下是人工智能领域中我们常用到的。
①sin()
import numpy as np
np.sin(x, out=None)
numpy.sin()函数用于计算输入数组x中每个元素的正弦值(输入的角度单位是弧度)。
代码示例如下:
import numpy as np
# 基本正弦值计算
angles = np.array([0, np.pi/2, np.pi])
sin_values = np.sin(angles)
print(sin_values) # 输出: [0. 1. 0.]
# 标量输入
angle = np.pi / 4
sin_value = np.sin(angle)
print(sin_value) # 输出: 0.7071067811865475
# 使用 out 参数
x = np.array([np.pi/6, np.pi/4, np.pi/3])
out_array = np.empty_like(x, dtype=float)
np.sin(x, out=out_array)
print(out_array) # 输出: [0.5 0.70710678 0.8660254 ]
# 与广播机制结合
a = np.array([[0, np.pi/2], [np.pi, 3*np.pi/2]])
sin_values = np.sin(a)
print(sin_values)
# 输出:
# [[ 0. 1.]
# [ 0. -1.]]
②cos()
import numpy as np
np.cos(x, out=None)
numpy.cos()函数用于计算输入数组x中每个元素的余弦值(输入的角度单位是弧度)。与numpy.sin()类似。
代码示例如下:
import numpy as np
# 基本余弦值计算
angles = np.array([0, np.pi/2, np.pi])
cos_values = np.cos(angles)
print(cos_values) # 输出: [ 1. 0. -1.]
③tan()
import numpy as np
np.tan(x, out=None)
numpytan()函数用于计算输入数组x中每个元素的正切值(输入的角度单位是弧度)。与numpy.sin()类似。
代码示例如下:
import numpy as np
# 基本正切值计算
angles = np.array([0, np.pi/4, np.pi/2])
tan_values = np.tan(angles)
print(tan_values) # 输出: [ 0.00000000e+00 1.00000000e+00 1.63312394e+16]
④around()
import numpy as np
np.around(a, decimals=0, out=None)
numpy.around()函数用于对数组中的元素进行四舍五入操作。我们可以控制保留的小数位数,默认情况下,它会四舍五入到最接近的整数。a参数为输入的要进行四舍五入的数据,包括数组、标量、元组等。decimals参数为保留的位数,默认情况为0。
代码示例如下:
import numpy as np
# 四舍五入到最接近的整数
arr = np.array([1.2, 2.5, 3.7])
rounded_arr = np.around(arr)
print(rounded_arr) # 输出: [1. 2. 4.]
# 四舍五入到指定的小数位数
arr = np.array([1.234, 2.345, 3.456])
rounded_arr = np.around(arr, decimals=2)
print(rounded_arr) # 输出: [1.23 2.35 3.46]
# 使用 out 参数
arr = np.array([1.234, 2.345, 3.456])
out_array = np.empty_like(arr, dtype=float)
np.around(arr, decimals=2, out=out_array)
print(out_array) # 输出: [1.23 2.35 3.46]
# 四舍五入多维数组
arr = np.array([[1.234, 2.345], [3.456, 4.567]])
rounded_arr = np.around(arr, decimals=1)
print(rounded_arr)
# 输出:
# [[1.2 2.3]
# [3.5 4.6]]
⑤floor()
import numpy as np
np.floor(x, out=None)
numpy.floor()函数用于计算数组中每个元素的向下取整值。
代码示例如下:
import numpy as np
# 基本向下取整操作
arr = np.array([1.2, 2.5, 3.7])
floored_arr = np.floor(arr)
print(floored_arr) # 输出: [1. 2. 3.]
# 向下取整负数
arr = np.array([-1.2, -2.5, -3.7])
floored_arr = np.floor(arr)
print(floored_arr) # 输出: [-2. -3. -4.]
# 使用 out 参数
arr = np.array([1.9, 2.8, 3.6])
out_array = np.empty_like(arr, dtype=float)
np.floor(arr, out=out_array)
print(out_array) # 输出: [1. 2. 3.]
# 向下取整多维数组
arr = np.array([[1.9, 2.8], [3.6, 4.4]])
floored_arr = np.floor(arr)
print(floored_arr)
# 输出:
# [[1. 2.]
# [3. 4.]]
⑥ceil()
import numpy as np
np.ceil(x, out=None)
numpy.ceil()函数用于计算数组中每个元素的向上取整值。
代码示例如下:
import numpy as np
# 基本向上取整操作
arr = np.array([1.2, 2.5, 3.7])
ceiled_arr = np.ceil(arr)
print(ceiled_arr) # 输出: [2. 3. 4.]
# 向上取整负数
arr = np.array([-1.2, -2.5, -3.7])
ceiled_arr = np.ceil(arr)
print(ceiled_arr) # 输出: [-1. -2. -3.]
# 使用 out 参数
arr = np.array([1.1, 2.2, 3.3])
out_array = np.empty_like(arr, dtype=float)
np.ceil(arr, out=out_array)
print(out_array) # 输出: [2. 3. 4.]
# 向上取整多维数组
arr = np.array([[1.1, 2.6], [3.4, 4.8]])
ceiled_arr = np.ceil(arr)
print(ceiled_arr)
# 输出:
# [[2. 3.]
# [4. 5.]]
3.聚合函数
numpy模块提供了很多统计函数,用于从数组中查找最小元素,最大元素,百分位标准差和方差等。
以上这些函数都可以直接传入数组进行运算操作并返回结果,这里就不一一赘述了。
总结
本篇博客介绍了numpy模块中ndarray数组的切割以及各类运算函数的使用操作。希望可以对大家起到作用,谢谢。
关注我,内容持续更新(后续内容在作者专栏《从零基础到AI算法工程师》)!!!