You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何均匀分配子数组长度来拆分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 05:17:03