简体   繁体   中英

Fastest way to Iterate a Matrix with vectors as entries in numpy

I'm using a function in python's opencv library to get the light flow movement of my hand as I move it around. Specifically http://docs.opencv.org/modules/video/doc/motion_analysis_and_object_tracking.html#calcopticalflowfarneback

This function outputs a numpy array

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

So flow is a matrix with each entry a vector. I want a way to quantify this matrix so I though of using the L1 Matrix norm (numpy.linalg.norm(flow, 1)) Which throws a improper dimensions to norm error.

I'm thinking about getting around this by calculating the euclidean norm of every vector and then finding the L1 norm of a matrix with the distances of the vectors.

I'm having trouble iterating through the flow matrix efficiently. I have done it using two for loops by going first through columns and then rows, but it's way too slow.

            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))

I had also tried using numpy.nditer but

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

just prints a single value rather than a vector.

What would be the fastest way to iterate through a numpy matrix with vectors as entries, norm them and then take the L1 norm?

As of numpy version 1.9, norm takes an axis argument.

Aside from that, say what you want ideally, and almost surely you can ask numpy to do it. Eg, assuming no complex entries or missing values, the simplest case np.sqrt((flow**2).sum()) or the case I think you describe np.linalg.norm(np.sqrt((flow**2).sum(axis=-1)),1) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM