逻辑OR列

时间:2012-08-28 17:48:31

标签: python matrix dynamic-programming logical-operators

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

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

某些上下文:我正在使用动态编程方法为我正在开发的小项目生成表。我有2个表,一个是3-d,另一个是2-d。在3-d表中只有1或0,而另一个包含整数。

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

示例:

三维表:

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

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

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

1000010001100001...
100010100000000...

不确定这一切是否清楚......但感谢任何有帮助的人! :d

我不会解释我使用的方法

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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, :]的能力对我来说太容易了,不容易放弃。

答案 2 :(得分:1)

这样的事情应该这样做。如同地图和过滤器一样,reduce正在变得不受欢迎。

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

对于python 2.x,使用xrange而不是range。