如何解决可以限制 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.generate
用 1
填充此数组的某些位置,从而排除存储在 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 举报,一经查实,本站将立刻删除。