在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
我不会解释我使用的方法
答案 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。