如何通过循环创建不同名称的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
相关产品推荐
相关产品推荐

