<think>我们正在讨论NumPy中的`split`函数。该函数用于将数组分割成多个子数组。让我们详细解释其使用规律和行为。
### 函数签名
`numpy.split(ary, indices_or_sections, axis=0)`
### 参数说明
1. **ary**: 要分割的输入数组。
2. **indices_or_sections**: 这个参数可以是整数或者一维数组。
- 如果是整数`N`,表示将数组沿指定轴均等分割成`N`个子数组。如果不能均等分割,会引发`ValueError`。
- 如果是一维数组,则数组中的元素表示沿指定轴的切分点(索引)。例如,`[2, 5]`表示在索引2和索引5处进行切分,将数组分成三部分:`[0:2]`, `[2:5]`, `[5:]`。
3. **axis**: 指定分割的轴(维度),默认为0(第一个维度)。
### 返回值
返回一个包含子数组的列表。
### 使用示例
#### 示例1:均等分割
```python
import numpy as np
a = np.arange(9)
# [0, 1, 2, 3, 4, 5, 6, 7, 8]
# 将数组a分成3个等长的子数组
b = np.split(a, 3)
print(b)
# [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
```
#### 示例2:按索引位置分割
```python
a = np.arange(9)
# 在索引3和索引7处分割
b = np.split(a, [3, 7])
print(b)
# [array([0, 1, 2]), array([3, 4, 5, 6]), array([7, 8])]
```
#### 示例3:沿其他轴分割
```python
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
# 沿行分割(axis=0)成2等份
b = np.split(a, 2, axis=0)
print(b)
# [array([[1, 2, 3], [4, 5, 6]]), array([[ 7, 8, 9], [10, 11, 12]])]
# 沿列分割(axis=1)在索引1处分割
c = np.split(a, [1], axis=1)
print(c)
# [array([[1], [4], [7], [10]]), array([[ 2, 3], [ 5, 6], [ 8, 9], [11, 12]])]
```
### 注意事项
- 当使用整数分割时,数组必须能够被均分,否则会报错。例如,长度为9的数组可以分成3等份(每份3个元素),但无法分成4等份(因为9/4不是整数)。
- 当使用索引列表分割时,索引列表中的值必须在数组的轴长度范围内,且通常是递增的。
- 分割点表示的是分割后的子数组的起始位置。例如,索引列表`[i, j]`表示第一个子数组是`ary[0:i]`,第二个是`ary[i:j]`,第三个是`ary[j:]`。
### 相关函数
NumPy还提供了其他分割函数,如:
- `array_split`: 类似于`split`,但允许不均等分割(不会报错)。
- `vsplit`: 沿垂直方向(行)分割,等价于`split(..., axis=0)`。
- `hsplit`: 沿水平方向(列)分割,等价于`split(..., axis=1)`。
### 示例:不均等分割(使用array_split)
```python
a = np.arange(9)
# 尝试分成4份,不等分
b = np.array_split(a, 4)
print(b)
# [array([0, 1, 2]), array([3, 4, 5]), array([6, 7]), array([8])]
```
### 总结
`numpy.split`是一个强大的数组分割工具,通过指定分割点或分割份数,可以灵活地将数组分割成多个子数组。注意分割的均等性要求,以及索引点的指定方式。
§§相关问题§§
1. `numpy.split`和`numpy.array_split`有什么区别?
2. 如何沿多维数组的不同轴进行分割?
3. 在分割数组时,如果索引超出范围会发生什么?
4. 能否使用`numpy.split`分割字符串数组?
5. 如何将分割后的子数组合并回原数组?</think>### NumPy `split` 函数使用详解
`numpy.split()` 函数用于将数组沿指定轴分割成多个子数组,其核心行为取决于第二个参数 `indices_or_sections` 的类型:
#### 函数签名
```python
numpy.split(ary, indices_or_sections, axis=0)
```
- **ary**: 要分割的输入数组
- **indices_or_sections**:
- 若为**整数 N**:将数组**均等分割**为 N 个子数组
- 若为**索引列表**:在指定索引位置分割
- **axis**: 分割的轴向(默认为 0)
---
### 使用规律与行为
#### 1. 均等分割(整数参数)
**要求**: 数组沿分割轴的长度必须能被整除
```python
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
result = np.split(arr, 3) # 分成3等份
# [array([1, 2]), array([3, 4]), array([5, 6])]
```
若无法整除会报错:
```python
np.split(arr, 4) # ValueError: array split does not result in an equal division
```
#### 2. 按索引分割(列表参数)
在指定索引位置切分:
```python
arr = np.array([1, 2, 3, 4, 5, 6])
result = np.split(arr, [2, 4]) # 在索引2和4处分割
# [array([1, 2]), array([3, 4]), array([5, 6])]
```
#### 3. 多维数组分割
沿指定轴操作:
```python
matrix = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
# 沿行分割(axis=0)
np.split(matrix, 2, axis=0)
# [array([[1, 2], [3, 4]]), array([[5, 6], [7, 8]])]
# 沿列分割(axis=1)
np.split(matrix, [1], axis=1)
# [array([[1], [3], [5], [7]]), array([[2], [4], [6], [8]])]
```
#### 4. 特殊分割函数
- `np.hsplit()`: 水平分割(等价于 `axis=1`)
- `np.vsplit()`: 垂直分割(等价于 `axis=0`)
- `np.array_split()`: 支持不等分分割
---
### 关键特性总结
| 行为 | 触发条件 | 结果示例 |
|------|----------|----------|
| 均等分割 | `indices_or_sections` 为整数 | `split([1,2,3,4], 2) → [[1,2],[3,4]]` |
| 索引分割 | `indices_or_sections` 为列表 | `split([1,2,3,4], [1,3]) → [[1],[2,3],[4]]` |
| 多维操作 | 指定 `axis` 参数 | 沿行/列分割矩阵 |
| 错误处理 | 无法整除时 | 抛出 `ValueError` |
> ⚠️ **注意**:当需要不等分分割时,应使用 `np.array_split()` 替代:
> ```python
> np.array_split([1,2,3,4,5], 3) # 返回3个子数组,长度可能不同
> ```