掘金 后端 ( ) • 2024-05-13 15:25

theme: channing-cyan highlight: tomorrow-night

前言

在NumPy中有这么一个概念,就是NumPy数组中的轴,其实很多人对这个概念似懂半懂,理解的不是很全面,本文就主要对这个概念进行一个通俗的讲解,准备好,马上开车。

NumPy轴的概念

在Numpy这个强大的Python科学计算库中,轴(Axis)是一个非常重要的概念,它贯穿于Numpy数组(ndarray)的各种操作中。下面,我们将从多个方面深入剖析Numpy轴的概念及其应用。

1、轴的定义与作用

在Numpy中,轴通常指的是数组的维度。对于一个多维数组,我们可以沿着不同的维度(即轴)进行各种操作,如求和、平均值计算、最大值查找等。轴的作用是确定这些操作是沿着哪个方向进行的。

2、数组维度与轴

Numpy数组可以是—维的、二维的,甚至是更高维度的。一维数组只有一个轴,二维数组有两个轴(通常称为行和列,第一个轴成为行轴,第二个轴成为列轴),以此类推。每个轴都有一个与之关联的索引,从0开始,按照数组维度的顺序递增。

通俗讲就是在NumPy中,一维数组有一个轴(0轴),二维数组有两个轴(0轴和1轴),以此类推。

举例代码:

import numpy as np

arr = np.arange(24).reshape(3, 8)
print('原数组')
print(arr)
print('\n')
# 在0轴上求和
sum_arr_0 = arr.sum(axis=0)
print('在0轴上求和')
print(sum_arr_0)
print('\n')
# 在1轴上求和
sum_arr_1 = arr.sum(axis=1)
print('在1轴上求和')
print(sum_arr_1)

# 输出结果:
# 原数组
# [[ 0  1  2  3  4  5  6  7]
#  [ 8  9 10 11 12 13 14 15]
#  [16 17 18 19 20 21 22 23]]
#
#
# 在0轴上求和
# [24 27 30 33 36 39 42 45]
#
#
# 在1轴上求和
# [ 28  92 156]

示意图

image.png 上面说了,二维数组只有两个轴,那它到底有没有第三个轴呢?我们在代码中测试一下

image.png 看到没,这个是报错的。

3、沿轴操作

Numpy提供了大量的函数,可以沿着指定的轴对数组进行操作。例如, numpy. sum()函数可以计算数组沿指定轴的元素和,numpy.mean()函数可以计算数组沿指定轴的平均值。这些函数通过axis参数指定操作的轴。

我们使用一下mean()函数:

相关代码:

import numpy as np

arr = np.arange(24).reshape(3, 8)
print('原数组')
print(arr)
print('\n')
# 计算0轴的平均值
mean_arr_1 = arr.mean(axis=0)
print('计算0轴的平均值')
print(mean_arr_1)
print('\n')
mean_arr_2 = arr.mean(axis=1)
print('计算1轴的平均值')
print(mean_arr_2)

# 输出结果
# 计算0轴的平均值
# [ 8.  9. 10. 11. 12. 13. 14. 15.]
# 
# 
# 计算1轴的平均值
# [ 3.5 11.5 19.5]
4、轴索引与切片

在Numpy中,我们可以通过索引和切片来访问和操作数组的元素。对于多维数组,我们可以通过指定每个轴的索引或切片范围来选择和操作数组的子集。这种灵活的数据访问方式使得 Numpy在处理复杂数据结构时非常高效。

其实轴索引与切片就是将两个函数联合起来使用罢了,简单写一个demo


import numpy as np

arr = np.arange(24).reshape(3, 8)
print('原数组')
print(arr)
print('\n')

# 轴索引与切片
new_arr = arr[..., 1:].sum(axis=0)
print('轴索引与切片')
print(new_arr)

# 输出结果
# 原数组
# [[ 0  1  2  3  4  5  6  7]
#  [ 8  9 10 11 12 13 14 15]
#  [16 17 18 19 20 21 22 23]]
# 
# 轴索引与切片
# [27 30 33 36 39 42 45]

5、广播机制与轴

Numpy的广播(Broadcasting)机制是—种强大的工具,它允许Numpy在执行元素级操作时自动扩展数组的形状,以便它们具有兼容的形状。在涉及多个数组的操作中,广播机制可以确保操作能够沿着正确的轴进行,而无需显式地调整数组的形状。

广播机制和轴,这么其实也就是两个数组进行广播后然后再通过轴进行一些操作。


import numpy as np

# 当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制
# 4x3 的二维数组与长为 3 的一维数组相加,等效于把数组 e 在二维上重复 4 次再运算
d = np.array([[0, 0, 0], [10, 10, 10], [20, 20, 20], [30, 30, 30]])
e = np.array([0, 1, 2])
print('广播后数组')
print(d+e)
print('\n')
# 广播机制与轴
print('广播机制与轴')
print((d+e).sum(axis=1))

# 输出
# 广播后数组
# [[ 0  1  2]
#  [10 11 12]
#  [20 21 22]
#  [30 31 32]]
# 
# 
# 广播机制与轴
# [ 3 33 63 93]
6、多轴协同操作

在实际应用中,我们经常需要同时对数组的多个轴进行操作。Numpy允许我们通过组合多个轴索引和切片操作来实现这—点。例如,我们可以先沿着一个轴进行求和操作,然后再沿着另一个轴进行排序操作。这种多轴协同操作的能力使得Numpy在处理复杂数据分析任务时非常灵活和高效。