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

如何通过循环创建不同名称的NumPy数组拆分大型数组?

如何通过循环创建不同名称的NumPy子数组?

我有一个形状为(98182, 2)的大型NumPy数组lines,其第一列是一个多次从1开始计数的计数器。已通过以下循环找到所有第一列值为1的索引并存入changes列表:

changes = []
for j in range(len(lines)):
    print(j)
    if lines[j,0] == 1 :
        changes.append(j)

changes列表前5个索引为:

[0,
 3643,
 6868,
 8434,
 14347, ...
]

手动切片可以通过line1 = lines[changes[0]:changes[1]]得到子数组,但需要拆分出17个不同长度的子数组,不想重复编写17次切片语句。尝试过类似以下写法,但无法将计数器i作为数组名称的一部分:

for i in range(len(lines)-1):
    line_[i] = lines[changes[i]:changes[i+1]]

解决方案

优先推荐:用列表/字典存储子数组(更易维护)

不建议创建大量单独命名的变量,用列表统一管理所有子数组是更规范的做法,代码简洁且便于后续操作:

首先可以优化changes的生成方式,用NumPy内置方法替代循环,效率更高:

import numpy as np
changes = np.where(lines[:, 0] == 1)[0]

然后循环生成子数组并存入列表:

sub_arrays = []
# 循环次数是changes的长度减1,因为要取changes[i]到changes[i+1]的切片
for i in range(len(changes) - 1):
    sub_arrays.append(lines[changes[i]:changes[i+1]])

之后访问第n个子数组只需用sub_arrays[n-1](比如第一个子数组是sub_arrays[0]),后续遍历、修改都更方便。

可选:创建单独命名的变量(不推荐)

如果确实需要生成line1、line2这类单独变量,可以利用Python的globals()全局命名空间字典来实现:

for i in range(len(changes) - 1):
    # 生成line1, line2...line17这样的变量名
    globals()[f'line{i+1}'] = lines[changes[i]:changes[i+1]]

这种方式虽然能生成目标变量,但会让代码变得混乱,变量过多时难以追踪和维护,因此仅在特殊场景下使用。

内容的提问来源于stack exchange,提问作者Travis_Dudeson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:15:35