python - 用向量作为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)

因此,流是一个矩阵,每个条目都是一个 vector 。我想要一种量化此矩阵的方法,因此我虽然使用了L1矩阵范数(numpy.linalg.norm(flow,1)),但该范数会给范数错误带来不正确的尺寸。

我正在考虑通过计算每个 vector 的欧几里德范数然后找到带有 vector 距离的矩阵的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

仅输出单个值而不是 vector 。

用 vector 作为条目遍历numpy矩阵,对其进行规范然后采用L1规范的最快方法是什么?

最佳答案

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

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

https://stackoverflow.com/questions/27277730/

相关文章:

opencv - 在Cygwin上安装Opencv

opencv - 检测图像中的标记以用于OpenCV中的透视变换

opencv - BackgroundSubtractorMOG2 阴影检测在阳光充足的场景中不起作

python - 使用 Python 和 Matplotlib 将立体图像和深度图转换为 3D 散点

opencv - 从 OpenCV 中的边获取多边形

opencv - 填充轮廓时,drawContours函数在OpenCV中如何工作?

python - 从我的Python代码返回Opencv Mat类型

python - 如何在python中使用opencv在图像上显示轴

opencv - 光流和手指跟踪

python - Spatstat:给定二维点列表,如何将它们连接到多边形中,并进一步使其成为研究区