如何让循环中符合条件的numpy数组按迭代顺序输出而非自动排序
问题原因
你当前输出顺序不符合预期、出现重复相同数组的核心原因有两点:
- 同一个外层循环生成的
x12/y12,可能同时匹配多组comb_x/comb_y的坐标组合,导致同一组数组被重复打印多次 - 如果你是先把匹配结果存入列表再统一输出,直接赋值
x12 = z1属于引用传递,后续修改z1/z2会覆盖之前已经存入列表的数组值,导致最终输出的所有数组数值异常
解决方案
调整逻辑:按迭代顺序输出,保留numpy数组格式
如果需要每个外层循环的数组只要命中至少一个坐标组合就仅输出一次,同时保证存储的数组是独立对象,修改代码如下:
import numpy as np a=np.array([0, 0, 0, 1, 1, 1, 2, 2, 2]) b=np.array([0, 1, 2, 0, 1, 2, 0, 1, 2]) z1=np.array([1, 1]) z2=np.array([1, 1]) comb_x=np.array([0, 0, 1, 1]) comb_y=np.array([0, 1, 0, 1]) # 若需要存储结果可初始化列表 result = [] for j, k in zip(a,b): z1[:]=0 z1[:j]=1 x12 = z1.copy() # 做值拷贝,避免后续修改影响已保存的结果 z2[:]=0 z2[:k]=1 y12 = z2.copy() for h, n, r in zip(comb_x, comb_y, np.arange(0,4)): if x12[h]==1 and y12[n]==1: print(x12, y12) result.append((x12, y12)) # 存入列表的是独立的numpy数组对象 break # 跳出内层循环,避免同一组x12/y12重复打印
输出验证
调整后输出和你给出的期望顺序完全一致,所有存储、输出的对象均为独立的numpy数组,不会出现后续修改覆盖历史值的问题。如果需要保留所有命中坐标的打印结果,去掉代码中的break即可,配合.copy()也能保证输出顺序严格匹配迭代顺序。
内容的提问来源于stack exchange,提问作者Stevan Nixon
相关产品推荐
相关产品推荐

