Python 如何用Numpy数组替换For循环和IF语句
我有一个numpy数组,如下所示: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
[[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
如您所见,每个循环需要6ms:#这是从[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)
您的阵列现在如下所示:5.88 ms±836µs(平均±标准偏差7次,每个循环100次)
因为现在这是一个numpy数组,所以您可以安全地使用for循环检查您的条件。例如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]]])
将是您的行[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语句的原始代码。这是有效应用条件的绝佳解决方案。不过,要创建组合,最好使用
非常正确,但我不确定它是否是一个常规网格,如果是,则只需应用一次就可以保存。但ofcnp.meshgrid()
是更优雅的解决方案。混合了Mashudan和emilanov的答案,我得到了我想要的答案!非常感谢np.meshgird
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, :] ...