【问题标题】:Iterate over matrices with distinct rows [duplicate]迭代具有不同行的矩阵[重复]
【发布时间】:2014-03-14 09:54:08
【问题描述】:

如何有效地遍历所有由 0 和 1 组成的 h × n 数组,其中所有行和所有列都是不同的?目前我正在这样做。

h = 10
n = 15
hxn = np.arange(h*n).reshape(h, -1)
for i in xrange(0, 2**(h*n)):
    M = (i >> hxn) & 1
#DO WORK

但这包括许多行或列相同的二维数组。我也不关心行或列的顺序。


我不想只测试每个 M 以查看它是否有重复的行或列并丢弃它们,因为这将非常低效。我想找到一种方法来迭代数量少得多且没有重复行或列的矩阵。

【问题讨论】:

  • 您是在尝试首先确定矩阵的行和列是否不同,然后对它们进行操作,还是对给定矩阵中的每个不同的行和/或列执行操作?
  • @ap 这些都不是。我想通过 n 个矩阵迭代所有 h 的子集。那只是矩阵没有重复的行或列。
  • 你确定它非常低效吗?你期待什么形状的矩阵?
  • @user2357112 形状是 h × n。在这种情况下,二进制 10 x 15 矩阵的总数为 2^(150)。但是没有重复列行的二进制 10 x 15 矩阵的数量要少得多。
  • 其实不是。一个非常粗略的上限表示,最多 10.4% 的 10 x 15 二进制矩阵有重复的行或列。

标签: python numpy


【解决方案1】:

您可以像这样使用 Numpy 的 sum() 函数设置新矩阵 M 和计算;

import numpy as np
h = 10
n = 15

M = np.zeros( (h,n), dtype ='float64' ) # create matrice M dimensioned h,n with floats
                                        # if you want integers instead of floats, change
                                        # dtype to 'int32'
hxn = np.arange(h*n).reshape(h, -1)

for i in xrange(0,h):   # loop in range h starting from 0
    for j in range(0,n):  # loop in range n from 0
        M[i,j] = sum([(i*j)*2])   # set matrice row and column, M[i,j] by sum([]) 

        print M

【讨论】:

  • 这似乎暗示只有 h*n 矩阵没有重复的行或列,但这是不对的。
  • 对,没有用 M=np.zeros( (h,n), dtype ='float64' ) 创建的重复行,它严格从 h 和 n 中的数据设置行和列.它汇总了 h 和 n 的所有出现次数,因此如果两次出现相同的情况,例如 h = 5 n =5 出现两次,它将在列中给出 2,因此您不必添加 *2 除非您想将其相乘两次出现次数 2.
  • M 不是二进制的。它们必须只包含 0 或 1。
  • 那么 M[i,j] += 1 而不是 M[i,j] = sum([(i*j)*2]),它将在 h 和n 共现,其余为 0。
猜你喜欢
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多