【问题标题】:Generate an array that statisfies some conditions生成满足某些条件的数组
【发布时间】:2020-12-06 01:49:43
【问题描述】:

我正在尝试生成一个满足以下条件的 3 维数组:

  1. 对于每个子二维数组,它们各自的行和列的总和必须小于 1;
  2. 对于这些相同的子 2D 数组,它们的所有组件中的一些也必须小于 1;
  3. 每个元素都必须小于 1。

例如,考虑一个 2x2x2 数组。那么这两个 2x2 数组(我称之为子数组)必须满足上面的两个条件。

我尝试使用拒绝方法解决这个问题,例如:

while done == False:
    array = np.random.randint(0, 100, size=(2,2,2))*(1/100)
    c1 = condition1(array) # returns True is condition 1 is satisfied
    c2 = condition2(array) # returns True is condition 2 is satisfied
    if c1 == True and c2 == True:
        done = True

这样做的问题是找到解决方案需要太多时间,我需要用 4 维和 5 维数组重复这个过程。另外,稍后我将对这个问题添加另一个约束,但一次只有一件事!

【问题讨论】:

  • 如果组件是指矩阵元素并且矩阵中的值实际上都是正数,正如您的示例代码所暗示的那样,那么条件 2 就足以保证条件一和三。

标签: python arrays python-3.x algorithm optimization


【解决方案1】:

您可以做的是从最初的 1xC 向量开始,然后将其转换为 NxN 矩阵(其中 N**2 = C)。在代码中,它看起来像这样:

N = 2 # Preferred sub matrix size
C = N ** 2
a = np.random.uniform(0, 1, (1, C)) # Generate uniform vector
a /= a.sum() # Normalize elements such that they sum to 1
a -= np.min(a) / 2 # Decrease every element by the minimum divided by 2 to make the sum less than one
a = a.reshape(N, N) # Reshape matrix

在这里,我们对向量进行归一化以使元素总和为 1,然后将每个元素减去向量的最小值除以 2,并重新整形向量以适合您的子矩阵大小。此过程应重复 N 次以获取 NxNxN 矩阵,您应堆叠生成的子矩阵以获取 3D 矩阵。

【讨论】:

  • 谢谢,我试试。很抱歉回复晚了,忙。一个问题:如果我希望总和等于 1,是否需要 a -= np.min(a) / 2?
  • @fregtd 如果您希望总和正好等于 1,那么您可以删除该行。但是,如果您希望总和小于 1,则应从向量中的所有元素中减去最小值除以大于 1 的某个量(在本例中为 2)。
猜你喜欢
  • 1970-01-01
  • 2020-02-02
  • 2021-01-26
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多