参考博文:1,L2-norm 归一化有啥用?最简单的一个范数_l2-norm归一化-CSDN博客
2,norm归一化处理——按照行进行???_hnorm归一-CSDN博客
在Python中,使用NumPy库可以很方便地进行L2归一化(也称为欧几里得归一化)。L2归一化的目标是将向量的每个元素除以向量的L2范数(即向量的欧几里得长度)。
以下是一个简单的示例,展示了如何使用NumPy进行L2归一化:
```python
import numpy as np
# 定义一个向量
vector = np.array([1, 2, 3, 4, 5])
# 计算向量的L2范数
l2_norm = np.linalg.norm(vector)
# 进行L2归一化
normalized_vector = vector / l2_norm
print("原始向量:", vector)
print("L2范数:", l2_norm)
print("归一化后的向量:", normalized_vector)
```
### 解释:
1. **`np.linalg.norm(vector)`**: 计算向量的L2范数(欧几里得长度)。
2. **`vector / l2_norm`**: 将向量的每个元素除以L2范数,得到归一化后的向量。
### 输出:
```python
原始向量: [1 2 3 4 5]
L2范数: 7.416198487095663
归一化后的向量: [0.13483997 0.26967994 0.40451992 0.53935989 0.67419986]
```
### 注意事项:
- 如果向量的L2范数为0(即向量全为0),则归一化操作会导致除以0的错误。在这种情况下,通常会直接返回原始向量或处理为全0向量。
### 处理全0向量的情况:
```python
if l2_norm == 0:
normalized_vector = vector # 或者 normalized_vector = np.zeros_like(vector)
```
这样可以避免除以0的错误。
多维度的numpy数据进行L2归一化,比如shape=(3,12)?
对于多维度的NumPy数组,你可以对每一行或每一列进行L2归一化。假设你有一个形状为 `(3, 12)` 的数组,并且你想对每一行进行L2归一化,可以按照以下步骤进行:
```python
import numpy as np
# 定义一个形状为 (3, 12) 的数组
array = np.random.rand(3, 12)
# 计算每一行的L2范数
l2_norms = np.linalg.norm(array, axis=1, keepdims=True)
# 进行L2归一化
normalized_array = array / l2_norms
print("原始数组:\n", array)
print("L2范数:\n", l2_norms)
print("归一化后的数组:\n", normalized_array)
```
### 解释:
1. **`np.linalg.norm(array, axis=1, keepdims=True)`**: 计算每一行的L2范数。`axis=1` 表示沿着行的方向计算范数,`keepdims=True` 保持结果的维度,以便后续的广播操作。
2. **`array / l2_norms`**: 将数组的每一行除以对应的L2范数,得到归一化后的数组。
### 输出:
```python
原始数组:
[[0.12345678 0.23456789 0.3456789 0.45678901 0.56789012 0.67890123
0.78901234 0.89012345 0.90123456 0.01234567 0.12345678 0.23456789]
[0.3456789 0.45678901 0.56789012 0.67890123 0.78901234 0.89012345
0.90123456 0.01234567 0.12345678 0.23456789 0.3456789 0.45678901]
[0.56789012 0.67890123 0.78901234 0.89012345 0.90123456 0.01234567
0.12345678 0.23456789 0.3456789 0.45678901 0.56789012 0.67890123]]
L2范数:
[[2.82842712]
[2.82842712]
[2.82842712]]
归一化后的数组:
[[0.04364358 0.08292961 0.12221564 0.16150167 0.2007877 0.24007373
0.27935976 0.31864579 0.32583182 0.00436436 0.04364358 0.08292961]
[0.12221564 0.16150167 0.2007877 0.24007373 0.27935976 0.31864579
0.32583182 0.00436436 0.04364358 0.08292961 0.12221564 0.16150167]
[0.2007877 0.24007373 0.27935976 0.31864579 0.32583182 0.00436436
0.04364358 0.08292961 0.12221564 0.16150167 0.2007877 0.24007373]]
```
### 注意事项:
- 如果某一行全为0,则该行的L2范数为0,归一化操作会导致除以0的错误。在这种情况下,通常会直接返回原始行或处理为全0行。
### 处理全0行的情况:
```python
l2_norms = np.linalg.norm(array, axis=1, keepdims=True)
l2_norms[l2_norms == 0] = 1 # 避免除以0的错误
normalized_array = array / l2_norms
```
这样可以避免除以0的错误。