使用向量作为numpy中的条目迭代矩阵的最快方法

时间:2014-12-03 17:16:14

标签: python opencv numpy

我在python的opencv库中使用一个函数来移动我的手的光流运动。具体来说是http://docs.opencv.org/modules/video/doc/motion_analysis_and_object_tracking.html#calcopticalflowfarneback

此函数输出numpy数组

flow = cv2.calcOpticalFlowFarneback(prevgray, gray, 0.5, 3, 15, 3, 5, 1.2, 0)
print flow.shape # prints (480,320,2)

因此,flow是一个矩阵,每个条目都是一个向量。我想要一种量化这个矩阵的方法,所以我使用了L1矩阵规范(numpy.linalg.norm(flow,1)),这会导致规范错误的维度不正确。

我想通过计算每个向量的欧几里德范数然后找到带有向量距离的矩阵的L1范数来解决这个问题。

我无法有效地迭代流矩阵。我通过首先通过列然后行来使用两个for循环来完成它,但它太慢了。

            r,c,d = flow.shape 
            flowprime = numpy.zeros((r,c),flow.dtype)
            for i in range(0,r):
                for j in range (0,c):
                    flowprime[i,j] = numpy.linalg.norm(flow[i,j], 2)
            print(numpy.linalg.norm(flowprime, 1))

我也尝试过使用numpy.nditer但是

for x in numpy.nditer(flow, op_flags=['readwrite']):
   print x

只打印单个值而不是矢量。

用向量作为条目迭代numpy矩阵的最快方法是什么,规范它们然后采用L1规范?

1 个答案:

答案 0 :(得分:1)

从numpy版本1.9开始,norm采用axis参数。

除此之外,理想地说出你想要的东西,几乎可以肯定你可以要求numpy去做。例如,假设没有复杂的条目或缺失值,最简单的情况np.sqrt((flow**2).sum())或我认为你描述np.linalg.norm(np.sqrt((flow**2).sum(axis=-1)),1)的情况。