可以限制 skopt.Lhs.generate 的结果吗?
Can one constrain the outcome of 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., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
我现在想使用 skopt.Lhs.generate
用 1
填充此数组的某些位置,从而我想排除存储在 ignore
:[=22 中的某些位置=]
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., 0., 1.],
[1., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 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], [0, 2], [4, 1]]
True
-----------------------
[[2, 0], [1, 2], [4, 1]]
True
-----------------------
[[4, 2], [0, 1], [2, 0]]
False
-----------------------
[[0. 1. 0.]
[0. 0. 0.]
[1. 0. 0.]
[0. 0. 0.]
[0. 0. 1.]]
所以,这里需要 3 次迭代,直到找到不在 ignore
中的位置。如果有人知道更直接的解决方案,请告诉我!
假设我有一个这样的数组:
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., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
我现在想使用 skopt.Lhs.generate
用 1
填充此数组的某些位置,从而我想排除存储在 ignore
:[=22 中的某些位置=]
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., 0., 1.],
[1., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 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], [0, 2], [4, 1]]
True
-----------------------
[[2, 0], [1, 2], [4, 1]]
True
-----------------------
[[4, 2], [0, 1], [2, 0]]
False
-----------------------
[[0. 1. 0.]
[0. 0. 0.]
[1. 0. 0.]
[0. 0. 0.]
[0. 0. 1.]]
所以,这里需要 3 次迭代,直到找到不在 ignore
中的位置。如果有人知道更直接的解决方案,请告诉我!