【问题标题】:Generating random unique 3D binary matrices生成随机唯一的 3D 二进制矩阵
【发布时间】:2020-08-31 17:13:56
【问题描述】:

我创建了一个包含一千个随机 10*10*10 二进制矩阵的列表。

P=[]
for idx in range (0,1000):
    s=(10,10,10)
    a=np.zeros(s)
    for i in range (0,10):
        for j in range (0,10):
            for k in range (0,10):
                c=np.random.random(1)
                if c>0.5:
                    c=1
                else:
                    c=0
                a[i][j][k]=c
    P.append(a)

之后,我尝试了以下操作以确保没有重复的矩阵。但是,我得到了一个错误。

unique_set=[]
for idx in P:
    if idx not in unique_set:
        unique_set.append(idx)
unique_set

这是我得到的错误:

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

我应该尝试什么?

【问题讨论】:

    标签: python arrays matrix random binary


    【解决方案1】:

    您收到该错误的原因是因为在执行 if idx not in unique_set 时需要在内部评估数组的真实性。

    解决方案取决于您的意图。如果您认为如果两个数组的所有元素都相等,则它们相等,那么您可以这样做:

    for idx in P:
        if not any(np.array_equal(idx, other_idx) for other_idx in unique_set):
            unique_set.append(idx)
    

    这会将每个idxunique_set 中的所有先前idxes 进行比较。逐元素比较在np.array_equals 中处理。

    除了你的错误,你真的应该考虑使用np.random.choice 来生成你的P。这将比纯 Python 中的 for 循环快得多。

    【讨论】:

      【解决方案2】:

      一种方法是与np.array_equal 比较unique_set 中的每个数组。

      def is_unique(array, unique_arrays):
          for arr in unique_arrays:
              if np.array_equal(array, arr):
                  return False
          return True
      

      如果数组是否唯一,此函数将返回。您的代码将如下所示:

      unique_set=[]
      for idx in P:
          if is_unique(idx, unique_set):
            unique_set.append(idx)
      unique_set
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-26
        • 2020-03-16
        • 1970-01-01
        • 2022-01-03
        • 2022-12-03
        • 1970-01-01
        • 2017-04-30
        • 2011-12-30
        相关资源
        最近更新 更多