python之Numpy的行列维度、axis=0/1/2...便捷记忆方法

本文介绍了在Numpy中理解和记忆行列维度的方法,强调了行列习惯,指出0维度对应行,1维度对应列。此外,解释了axis参数的意义,0轴沿行方向,1轴沿列方向,帮助加深对Numpy操作的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文关键词: 行列习惯 行列习惯 行列习惯

一、行列维度

A = np.array([1, 2, 3, 4, 5, 6])	# 一维
print(A.shape)
>>>(6,)					# 1X6 (1行6列)


B = np.array([[1, 2], [3, 4], [5, 6]])	# 二维
print(B.shape)
>>>(3, 2)				# 3X2 (3行2列)

C = np.array([[[1], [2]], [[3], [4]], [[5], [6]]])	# 三维
print(C.shape)
>>>(3, 2, 1)				# 可以看到新增加的维度是从左边插入的

矩阵Tips
  1. 行列习惯: 一般说话的习惯是行列 (很少有人习惯说列行吧) ,所以在矩阵中 m x n 就是m行×n列。
  2. 维度是从0开始索引的,矩阵有两个维度,第一个是0维度,第二个是1维度,其中0维度对应行,1维度对应列,符合行列习惯。(上面的代码中生成了3×2的数组B,即0维度有3个元素,1维度有2个元素。)
  3. 一维数组一定要用 1 × n 来记!!
奇怪的分析(可能是错的,看了忘了就好)
  1. 左边插入: 对A,B,C三个数组分析即可知道新增加的维度是从左边插入的 (那为啥0维度是行而不是列? 有点矛盾啊)
  2. 一维数组为啥是 (6 , ) 而不是 (, 6) 。这样才能对应上 (行,列) 吧?
  3. 两个矩阵的乘积(例如Y*Z)必须要满足:Y的1维
<think>我们正在讨论Pandas中的数据归一化操作,特别是使用`div`和`sum`结合`axis`参数的操作。 根据用户的问题,他想理解或调试类似这样的代码:`data.div(data.sum(axis=1), axis=0)` 或者类似的形式(用户提到“div sum axis”)。 引用[1]中提到了一个例子:`data.sum(axis=1)`,这里`data`是一个DataFrame。在Pandas中,`axis`参数的含义是: - `axis=0`:沿着行的方向(即每一)进行操作(操作) - `axis=1`:沿着的方向(即每一行)进行操作(行操作) 归一化操作通常是指将每一行(或每一)的数据除以该行(或)的总和,使得每行(或)的和变为1(或其他归一化目标)。 用户提到的代码可能是对DataFrame进行按行归一化(即每一行除以该行的和)或按归一化(每一除以该的和)。 常见的归一化操作有两种情况: 1. 按行归一化:每一行除以该行的和,使得每一行的和为1。 代码:`df.div(df.sum(axis=1), axis=0)` 解释:`df.sum(axis=1)` 计算每一行的和,得到一个Series(索引与df的行索引相同)。然后使用`div`方法,将df的每一行除以对应的和。这里`axis=0`在`div`方法中表示匹配行索引(即按行方向进行除法,每行的每个元素都除以该行的和)。 2.归一化:每一除以该的和,使得每一的和为1。 代码:`df.div(df.sum(axis=0), axis=1)` 解释:`df.sum(axis=0)` 计算每一的和,得到一个Series(索引与df的索引相同)。然后使用`div`方法,将df的每一除以对应的和。这里`axis=1`在`div`方法中表示匹配索引(即按方向进行除法,每的每个元素都除以该的和)。 注意:在`div`方法中,`axis`参数用于指定匹配的轴。当我们将一个DataFrame除以一个Series时,我们需要指定Series的索引与DataFrame的哪个轴对齐。具体来说: - 当`axis=0`时,表示Series的索引与DataFrame的行索引对齐,因此Series的每个元素会匹配到DataFrame的每一行(即对每一行进行操作)。 - 当`axis=1`时,表示Series的索引与DataFrame的索引对齐,因此Series的每个元素会匹配到DataFrame的每一(即对每一进行操作)。 下面我们用一个示例来演示按行归一化: 假设有以下DataFrame(4行3): ```python import pandas as pd import numpy as np np.random.seed(0) data = pd.DataFrame(np.random.randint(1,10, size=(4,3)), columns=['A','B','C']) print("原始数据:") print(data) ``` 输出: ``` 原始数据: A B C 0 5 8 9 1 5 3 8 2 6 8 1 3 2 7 7 ``` 按行归一化(每行除以该行的和): ```python row_sums = data.sum(axis=1) # 计算每行的和 print("每行的和:") print(row_sums) normalized_data = data.div(row_sums, axis=0) print("按行归一化后的数据:") print(normalized_data) ``` 输出: ``` 每行的和: 0 22 1 16 2 15 3 16 dtype: int64 按行归一化后的数据: A B C 0 0.227273 0.363636 0.409091 1 0.312500 0.187500 0.500000 2 0.400000 0.533333 0.066667 3 0.125000 0.437500 0.437500 ``` 验证:归一化后每行的和应该为1(由于浮点数精度,可能显示接近1的数)。 同样,按归一化的示例: ```python col_sums = data.sum(axis=0) # 计算每的和 print("每的和:") print(col_sums) normalized_data_col = data.div(col_sums, axis=1) print("按归一化后的数据:") print(normalized_data_col) ``` 输出: ``` 每的和: A 18 B 26 C 25 dtype: int64 按归一化后的数据: A B C 0 0.277778 0.307692 0.360000 1 0.277778 0.115385 0.320000 2 0.333333 0.307692 0.040000 3 0.111111 0.269231 0.280000 ``` 注意:按归一化后,每的和为1。 总结: - `data.sum(axis=1)`:计算每行的和,返回一个行索引的Series。 - `data.div(series, axis=0)`:将data的每一行除以series中对应行的值(即series的索引与data的行索引对齐)。 - `data.div(series, axis=1)`:将data的每一除以series中对应的值(即series的索引与data的索引对齐)。 因此,用户提到的“div sum axis”代码,如果是指按行归一化,则代码为:`df.div(df.sum(axis=1), axis=0)` 在调试时,可以逐步进行: 1. 计算和:`s = df.sum(axis=1)` 2. 检查计算的和是否正确(是否有NaN,是否全为0?因为除以0会导致问题) 3. 进行除法:`df_normalized = df.div(s, axis=0)` 如果遇到除零错误(即某行的和为0),需要先处理这些行(例如,填充为0或跳过)。 引用说明: - 引用[1]中提到了`data.sum(axis=1)`,这和我们这里的用法一致。 - 引用[2]介绍了Pandas的一些基本属性,但没有直接涉及归一化操作。 最后,生成相关问题: - 关于归一化操作,可能产生的问题有:如何处理除零错误?归一化的其他方法(如最小-最大归一化)?归一化后数据如何解释? 因此,我们生成以下相关问题: §§相关问题§§ 1. Pandas中如何处理归一化时出现的除零错误? 2. 除了除以总和,还有哪些常用的数据归一化方法? 3. 如何将归一化后的数据恢复到原始数据?</think>### Pandas 数据归一化操作解析:`div` + `sum` + `axis` 在 Pandas 中,数据归一化是常见的数据预处理操作,特别是使用 `div()`、`sum()` 和 `axis` 参数的组合。下面通过具体示例逐步解释: #### 1. 创建测试数据 ```python import pandas as pd import numpy as np # 创建 3x4 的 DataFrame np.random.seed(42) data = pd.DataFrame(np.random.randn(4, 3), columns=['A', 'B', 'C']) print("原始数据:") print(data) ``` 输出: ``` A B C 0 0.496714 -0.138264 0.647689 1 1.523030 -0.234153 -0.234137 2 1.579213 0.767435 -0.469474 3 0.542560 -0.463418 -0.465730 ``` #### 2. 归一化操作解析 **目标**:将每行数据除以该行的总和,使每行和为 1 **代码实现**: ```python # 按行归一化 normalized_data = data.div(data.sum(axis=1), axis=0) print("\n归一化后数据:") print(normalized_data) ``` **代码分解**: 1. `data.sum(axis=1)` - 计算每行的总和(沿方向求和) - 输出:`[1.006139, 1.054740, 1.877174, -0.386588]` - 数学表示: $$ \text{row\_sum}_i = \sum_{j=1}^{n} \text{data}_{ij} \quad \text{其中 } i \text{ 为行索引} $$ 2. `data.div(row_sums, axis=0)` - 将原始数据每行除以其对应的行和 - `axis=0` 表示沿行方向对齐(行索引匹配) - 数学表示: $$ \text{normalized}_{ij} = \frac{\text{data}_{ij}}{\text{row\_sum}_i} $$ **输出验证**: ``` A B C 0 0.493751 -0.137475 0.643724 # 0.493751 -0.137475 + 0.643724 ≈ 1 1 1.443858 -0.222004 -0.221854 # 和 ≈ 1 2 0.841205 0.408799 -0.250004 # 和 ≈ 1 3 -1.403394 1.198558 1.204836 # 注意负值处理 ``` #### 3. 关键参数说明 | 参数 | 作用 | 数学含义 | |------|------|----------| | `axis=1` | 沿方向操作(行求和) | 对矩阵的行向量求和:$ \mathbf{r} = \mathbf{X}\mathbf{1} $ | | `axis=0` | 沿行方向对齐(匹配行索引) | 除法时的维度广播:$ \mathbf{X}_{norm} = \mathbf{X} \oslash (\mathbf{r}\mathbf{1}^T) $ | | `div()` | 元素级除法 | $ z_{ij} = x_{ij} / y_i $ | #### 4. 常见问题调试 **问题 1:出现 NaN 值** 原因:当行和为 0 时触发除零错误 解决:添加极小值避免除零 ```python row_sums = data.sum(axis=1).replace(0, 1e-10) normalized_data = data.div(row_sums, axis=0) ``` **问题 2归一化 vs 行归一化** - 归一化(每除以其和): ```python col_sums = data.sum(axis=0) # axis=0 沿行方向求和 normalized_col = data.div(col_sums, axis=1) # axis=1 匹配索引 ``` **问题 3:负值处理** 归一化后负值仍保留比例关系(如输出行3),若需[0,1]范围归一化,改用: ```python # 最小-最大归一化 normalized_minmax = (data - data.min()) / (data.max() - data.min()) ``` #### 5. 数学原理 对于 $ m \times n $ 矩阵 $\mathbf{X}$: - 行归一化: $$ \mathbf{X}_{\text{norm}} = \text{diag}(\mathbf{X}\mathbf{1})^{-1} \mathbf{X} $$ - 归一化: $$ \mathbf{X}_{\text{norm}} = \mathbf{X} \ \text{diag}(\mathbf{1}^T\mathbf{X})^{-1} $$ 其中 $\mathbf{1}$ 是全1向量,$\text{diag}()$ 是将向量转为对角矩阵的操作[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值