python 优化循环

np.random.seed(1)
d = 100  # d 一般会很大
L1 = np.random.rand(d, d)
cor = L1 + L1.T
# 如何较快、少用循环找到符合下面要求的数
# 第一个问题,
# 找到这样的(i,j,k),其中i<j<k 使得 cor[i,j] cor[i,k] cor[j,k] 均小于0.5
# 第二个问题
# 找到这样的(i,j,k, m),其中i<j<k<m 使得 cor[i,j] cor[i,k] cor[j,k] cor[i,m] cor[k,m] cor[j,m]均小于0.5

参考:
http://www.voidcn.com/article/p-prdxrmxg-bxx.html

在这两个问题里,是找到一个还是全部符合条件的组合呢?我想了一下,不用循环可能无法实现。下面的算法,找出了全部的组合,如果仅需要找到一个,请题主自行修改吧。

>>> import numpy as np
>>> d = 100
>>> np.random.seed(1)
>>> L1 = np.random.rand(d, d)
>>> cor = L1 + L1.T
>>> ax0, ax1 = np.where(cor<0.5)
>>> for i in range(d):
        for j in ax1[np.where(ax0==i)]:
            if j > i:
                for k in ax1[np.where(ax0==j)]:
                    if k > j and i in ax0[np.where(ax1==k)]:
                        print((i,j,k), cor[i,j], cor[i,k], cor[j,k])

				
(0, 16, 28) 0.4183377350248616 0.256502892217479 0.46252712973696464
(1, 22, 41) 0.46864431481723234 0.18270364885023738 0.437556308971328
(1, 22, 42) 0.46864431481723234 0.10388035304378718 0.14676445012815875
(1, 22, 49) 0.46864431481723234 0.044221670645735234 0.35750045269073283
(1, 33, 97) 0.21304230987766593 0.34620346678256364 0.3781657230089839
(1, 42, 49) 0.10388035304378718 0.044221670645735234 0.4791603678788019
... ... 
>>> for i in range(d):
        for j in ax1[np.where(ax0==i)]:
            if j > i:
                for k in ax1[np.where(ax0==j)]:
                    if k > j:
                        for m in ax1[np.where(ax0==k)]:
                            if m > k and i in ax0[np.where(ax1==k)] and i in ax0[np.where(ax1==m)] and j in ax0[np.where(ax1==m)]:
                                print((i,j,k,m), cor[i,j], cor[i,k], cor[i,m], cor[j,k], cor[j,m], cor[k,m])

							
(1, 22, 42, 49) 0.46864431481723234 0.10388035304378718 0.044221670645735234 0.14676445012815875 0.35750045269073283 0.4791603678788019
(3, 26, 44, 74) 0.23862387167058108 0.2310144987015792 0.27889633145110926 0.46262359217816873 0.3240033414684502 0.4100168508081877
... ...

 

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y