Numpy - 计算矩阵

时间:2017-06-19 16:32:34

标签: python numpy

我正在寻找一种快速,计算效率高的方式来在矩阵中计算矩阵中心具有“1”的非间断序列“1”的长度(例如列在下面的例子中为5)。在下面的示例代码中 - 期望的答案是3,4,5,6。我的实际矩阵的行和列有很多倍,所以我特别想找到一种以计算有效的方式执行此操作的方法。任何建议都非常感激。

from numpy import *
a = array([0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0])
a=a.reshape(4,9) 

1 个答案:

答案 0 :(得分:0)

当一半或两半可能充满1s0s时,忽略边界情况,这里有一种方法,使用slicing选择两半,然后argmin()到检测从10 -

的转变
# Get middle col ID
n = (a.shape[1]+1)//2

# Get non-interrupted length from middle col to left and right and add up
lens = a[:,n:].argmin(1)+a[:,n-1::-1].argmin(1)

包括边界案例可能涉及使用if-else串来检查来自argmin的那些索引是否确实是0

示例运行 -

In [60]: a
Out[60]: 
array([[0, 1, 0, 1, 1, 1, 0, 0, 0],
       [1, 0, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 1],
       [0, 0, 1, 1, 1, 1, 1, 1, 0]])

In [61]: n = (a.shape[1]+1)//2

In [62]: a[:,n:].argmin(1)+a[:,n-1::-1].argmin(1)
Out[62]: array([3, 4, 5, 6])