【问题标题】:logical OR column逻辑或列
【发布时间】:2012-08-23 06:49:11
【问题描述】:

在 Python 中对矩阵的每一列执行逻辑 OR(在 1 和 0 上)的最有效方法是什么?

   0    0    0
   0    0    0
   1    0    1
   0    0    1
OR 0    0    1
   _    _    _
   1    0    1

一些背景:我正在使用一种动态编程方法来为我一直在从事的一个小项目生成一个表。我有两张桌子,一张是 3-d,另一张是 2-d。在 3-d 表中只有 1 或 0,而另一个包含整数。

2-d 表与 3-d 表一样生成,所以我必须将它们交错。我想要 OR 整个列的原因是查看其中是否有任何 1,如果是,则同一列将在 2-d 表中包含 1。

例子:

3-d 表:

[1][i][j]
1000010000000000...
1000000001000000...
1000000000010000...
1000000000000001...

[2][i][j]
1000100000000000...
1000001000000000...
1000000001000000...

二维表: (在对 3-d 表的每一列进行 OR 运算后,其中最左边的索引对应于 2-d 表中的一行):

1000010001100001...
100010100000000...

不确定这是否全部清楚...但感谢任何提供帮助的人! :D

我不会解释我使用的方法

【问题讨论】:

  • bitwise operators。也可能减少。
  • 你可以使用 NumPy,还是想要一些自给自足的东西?
  • @DSM numpy 中的代码是什么?
  • @DSM -- 发布您的 numpy 代码作为解决方案。 (没有理由让我们都处于悬念之中;^)

标签: python matrix dynamic-programming logical-operators


【解决方案1】:

您如何表示这些数据?如果这是列表列表,则交换 3D 数组的最后两个索引,因此“列”可以作为顺序列表访问,并使用 any。这与普通 CPython 中的速度差不多:循环将在 C 运行时中完全执行。

【讨论】:

  • 谢谢,它们确实是列表列表,这是我实现的方法:)
【解决方案2】:

使用numpy

>>> from numpy import array
>>> m = array([[0,0,0],[0,0,0],[1,0,1],[0,0,1],[0,0,1]])
>>> m
array([[0, 0, 0],
       [0, 0, 0],
       [1, 0, 1],
       [0, 0, 1],
       [0, 0, 1]])
>>> m.any(0)*1
array([1, 0, 1])
>>> len('.any(0)*1')
9

或者,不那么简洁:

>>> m.any(axis=0)
array([ True, False,  True], dtype=bool)
>>> m.any(axis=0)*1 # make them ints
array([1, 0, 1])

如果您必须使用纯 Python,我实际上会按照 @rkhayrov 的建议进行操作,如果有必要,请继续转置和索引混洗,以使引用列就像引用列表一样容易。但是写m[:, 0]m[2:5, :]的能力太方便了,我不能轻易放弃。

【讨论】:

    【解决方案3】:

    应该这样做。 reduce 不受欢迎,map 和 filter 也是如此。

    col = 2
    value = 0
    for row in range(height):
        value |= matrix[row][col]
    

    对于 python 2.x,使用 xrange 代替 range。

    【讨论】:

    • map()filter()reduce() 被认为是非 Python 的,而不是 列表推导。对于像上面这样的 reduction 操作,reduce() 是完全可以接受的。
    • @Joel:我认为reduce() 不被认为是unpythonic,因为它可以被列表理解替换(事实上,它不能)。基本上只是因为Guido doesn't like it
    • @NiklasB.:啊。当然。呵呵,我试图用列表理解替换reduce(),我能做的最好的就是z = lambda a, b=[1]: b.__setitem__(0, mul(b[0], a)) or b; [z(x) for x in range(1, 10)] :)
    猜你喜欢
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2015-11-30
    • 2015-02-27
    • 2011-08-25
    • 2012-04-09
    • 2014-10-07
    相关资源
    最近更新 更多