Python 如何用Numpy数组替换For循环和IF语句

Python 如何用Numpy数组替换For循环和IF语句,python,numpy,Python,Numpy,我有一个numpy数组,如下所示: [[1, 2], [1, 3], [2, 1], [2, 2], [2, 3], ...] 我想得到所有“子”数组(即[X,Y])的三乘三的组合: [[1, 1] [1, 1] [1, 1], [1, 1] [1, 1] [1, 2], [1, 1] [1, 1] [1, 3], ... [5, 5] [5, 5], [5, 4], [5, 5] [5, 5], [5, 5]] 然后,我需要对每个组合应用条件: X1、X2、X3>0 X1+Y1

我有一个numpy数组,如下所示:

[[1, 2], [1, 3], [2, 1], [2, 2], [2, 3], ...]
我想得到所有“子”数组(即[X,Y])的三乘三的组合:

[[1, 1] [1, 1] [1, 1],
 [1, 1] [1, 1] [1, 2],
 [1, 1] [1, 1] [1, 3],
 ...
 [5, 5] [5, 5], [5, 4],
 [5, 5] [5, 5], [5, 5]]
然后,我需要对每个组合应用条件:

  • X1、X2、X3>0
  • X1+Y1 0
    和中心[0]>=左[0]+左[1]
    和中间[1]/左[1]<2
    和中间[0]/左[0]<2
    左[1]/中[1]<2
    左[0]/中[1]<2
    和str(左[0])+“y”+str(左[1])+“y”!=str(中心[0])+“y”+str(中心[1])+“y”
    ):
    对于mylist中的右侧:
    如果(右[0]>0
    右[0]>=中心[0]+中心[1]
    右[1]/中[1]<2
    右[0]/中[0]<2
    和中间[1]/右[1]<2
    和中间[0]/右[0]<2
    和str(右[0])+“y”+str(右[1])+“y”!=str(中心[0])+“y”+str(中心[1])+“y”
    ):
    组合.追加([[left[0],left[1]],[center[0],center[1]],[right[0],right[1]]))
    
    编辑:您甚至不需要
    itertools
    您可以使用
    numpy
    创建组合,而且速度非常快

    #这是从[1,1]到[5,5]的输入数组
    a=np.array(np.meshgrid(np.arange(1,6),np.arange(1,6)).T.重塑(-1,2)
    b=np.数组(np.网格网格(a,a,a)).T.重塑(-1,3,2)
    
    如您所见,每个循环需要6ms:
    5.88 ms±836µs(平均±标准偏差7次,每个循环100次)

    您的阵列现在如下所示:

    
    array([[[1, 1],
            [1, 1],
            [1, 1]],
    
           [[1, 1],
            [1, 1],
            [1, 2]],
    
           [[1, 1],
            [1, 1],
            [1, 3]],
    
           ...,
    
           [[5, 5],
            [5, 5],
            [5, 3]],
    
           [[5, 5],
            [5, 5],
            [5, 4]],
    
           [[5, 5],
            [5, 5],
            [5, 5]]])
    
    因为现在这是一个numpy数组,所以您可以安全地使用for循环检查您的条件。例如
    行[0,0]
    将是您的
    X1
    行[0,1]
    将是您的
    Y1

    对于b中的行:
    
    行[0,0]+行[0,1]尝试
    itertool
    numpy
    类似:

    将numpy导入为np
    进口itertools
    some_list=[[1,2]、[1,3]、[2,1]、[2,2]、[2,3]、-1、-1]]
    #使用“itertools.compositions”或“itertools.compositions_with_replacement”
    #无论你想得到什么,在热的重复元素。
    #然后将其投射到numpy数组中。
    combines=np.array(列表(itertools.combines)和替换(部分列表,3)))
    #从这里,您可以在numpy sytax中执行布尔语句
    #应用您的第一条规则“X1、X2、X3>0”可以通过以下方式完成:
    第一条规则=组合[:,:,0]>0
    打印('第一个规则“X1,X2,X3>0”的布尔数组')
    打印(np.all(第一条规则,轴=1))
    
    #以及itertools进口产品的第二条规则“X1+Y1
    
    a=[[1,1]、[1,2]、[1,3]、[2,1]、[2,2]、[2,3]]
    perms=np.array(列表(产品(a,重复=3)))
    
    这将创建一个形状数组
    (n^3,3,2)
    ,其中
    n
    a
    中的元素数

    现在你可以做你所有的手术了

    perms[:, :, 0] > 0
    perms[:, 0, 0] + perms[:, 0, 1] <= perms[:, 1, 0]
    perms[:, 1, 0] + perms[:, 1, 1] <= perms[:, 2, 0]
    perms[:, 0, :] != perms[:, 1, :]
    perms[:, 1, :] != perms[:, 2, :]
    ...
    
    perms[:,:,0]>0
    
    perms[:,0,0]+perms[:,0,1]到目前为止你写了什么代码?我编辑了我的帖子,添加了带有for循环和if语句的原始代码。这是有效应用条件的绝佳解决方案。不过,要创建组合,最好使用
    np.meshgrid()
    非常正确,但我不确定它是否是一个常规网格,如果是,则只需应用一次就可以保存。但ofc
    np.meshgird
    是更优雅的解决方案。混合了Mashudan和emilanov的答案,我得到了我想要的答案!非常感谢
    perms[:, :, 0] > 0
    perms[:, 0, 0] + perms[:, 0, 1] <= perms[:, 1, 0]
    perms[:, 1, 0] + perms[:, 1, 1] <= perms[:, 2, 0]
    perms[:, 0, :] != perms[:, 1, :]
    perms[:, 1, :] != perms[:, 2, :]
    ...