1

在 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,如果是,则同一列将在二维表中包含 1。

例子:

3维表:

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

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

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

1000010001100001...
100010100000000...

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

我不会解释我使用的方法

4

3 回答 3

2

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

于 2012-08-28T17:56:08.530 回答
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, :]对我来说太得心应手了,不能轻易放弃。

于 2012-08-28T18:25:38.707 回答
1

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

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

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

于 2012-08-28T17:55:29.140 回答