如何均匀分配子数组长度来拆分NumPy数组?
实现均匀分布长度的NumPy数组拆分
NumPy没有直接提供这种将子数组长度差异均匀分散的内置拆分方法,numpy.array_split采用贪心分配逻辑——将多余元素依次分配给前面的子数组,导致前半部分子数组普遍更长,和你的需求不符,因此需要自行编写拆分逻辑。
下面是一个通用实现,可根据需求生成均匀交替分布的子数组长度:
import numpy as np def evenly_split(arr, num_chunks): n = arr.size base_len = n // num_chunks extra = n % num_chunks lengths = np.full(num_chunks, base_len) # 根据多余元素数量,均匀分配额外长度到目标索引 if extra > 0: # 优先填充偶数索引(匹配你3 chunks的对称期望) even_indices = np.arange(0, num_chunks, 2) take_evens = min(extra, len(even_indices)) lengths[even_indices[:take_evens]] += 1 remaining = extra - take_evens if remaining > 0: # 剩余额外长度填充奇数索引(匹配你5 chunks的交替期望) odd_indices = np.arange(1, num_chunks, 2) lengths[odd_indices[:remaining]] += 1 # 根据生成的长度拆分数组 split_points = np.cumsum(lengths[:-1]) return np.split(arr, split_points) # 测试示例 a = np.arange(17) for c in [3, 5, 10]: chunks = evenly_split(a, c) sizes = np.array([x.size for x in chunks]) print(f'{c} chunks sizes: {sizes}')
若要完全匹配你10 chunks的[2 2 1 2 2 1 2 2 1 2]期望,只需修改索引选择逻辑为"每两个长数组后放置一个短数组",核心思路都是基于基础长度和多余元素数,将额外长度按需分配到均匀位置上。
总之,你需要根据具体的分布需求编写自定义逻辑,NumPy没有直接对应的内置函数。
内容的提问来源于stack exchange,提问作者user2671688
相关产品推荐
相关产品推荐

