微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可以限制 skopt.Lhs.generate 的结果吗?

如何解决可以限制 skopt.Lhs.generate 的结果吗?

假设我有一个这样的数组:

from skopt.space import Space
from skopt.sampler import Lhs
import numpy as np

np.random.seed(42)

rows = 5
cols = 3

dummy = np.zeros((rows,cols))

array([[0.,0.,0.],[0.,0.]])

我现在想使用 skopt.Lhs.generate1 填充此数组的某些位置,从而排除存储在 ignore 中的某些位置:

ignore = np.array([
    [3,1],[4,1]
])

我该如何做到最好?

我能做到

space = Space([(0,rows - 1),(0,cols - 1)])

lhs = Lhs(criterion="maximin",iterations=1000)
lh = np.array(lhs.generate(space.dimensions,3))

dummy[lh[:,0],lh[:,1]] = 1

给出

array([[0.,1.],[1.,1.,0.]])

但是可以看到位置 4,1 被占用,但它不应该。

一种方法是将 lhs.generate 调用放在 while 循环中,然后始终检查 ignore 中是否有任何元素,但我想知道是否有更直接的解决方案这个。

解决方法

为了完整起见,使用 while 循环的解决方案可能如下所示:

from skopt.space import Space
from skopt.sampler import Lhs
import numpy as np

def contains_element(a,b):
    return any(li in a for li in b)

np.random.seed(42)

rows = 5
cols = 3

dummy = np.zeros((rows,cols))

ignore = [
    [3,1],[4,1]
]

space = Space([(0,rows - 1),(0,cols - 1)])

contains_row = True
while contains_row:

    lhs = Lhs(criterion="maximin",iterations=1000)
    lh = lhs.generate(space.dimensions,3)
    contains_row = contains_element(lh,ignore)
    print(lh)
    print(contains_row)
    print('-----------------------\n')

lh = np.array(lh)
dummy[lh[:,0],lh[:,1]] = 1

print(dummy)

哪个打印

[[2,[0,2],1]]
True
-----------------------

[[2,[1,1]]
True
-----------------------

[[4,[2,0]]
False
-----------------------

[[0. 1. 0.]
 [0. 0. 0.]
 [1. 0. 0.]
 [0. 0. 0.]
 [0. 0. 1.]]

因此,这里需要 3 次迭代,直到找到不在 ignore 中的位置。如果有人知道更直接的解决方案,请告诉我!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。