# [ACCEPTED]-Intersection of 2D numpy ndarrays-numpy

Score: 17

You can use a view of the array as a single 6 dimension to the intersect1d function like 5 this:

``````def multidim_intersect(arr1, arr2):
arr1_view = arr1.view([('',arr1.dtype)]*arr1.shape[1])
arr2_view = arr2.view([('',arr2.dtype)]*arr2.shape[1])
intersected = numpy.intersect1d(arr1_view, arr2_view)
return intersected.view(arr1.dtype).reshape(-1, arr1.shape[1])
``````

This creates a view of each array, changing 4 each row to a tuple of values. It then performs 3 the intersection, and changes the result 2 back to the original format. Here's an example 1 of using it:

``````test_arr1 = numpy.array([[0, 2],
[1, 3],
[4, 5],
[0, 2]])

test_arr2 = numpy.array([[1, 2],
[0, 2],
[3, 1],
[1, 3]])

print multidim_intersect(test_arr1, test_arr2)
``````

This prints:

``````[[0 2]
[1 3]]
``````
Score: 4

you can use http://pypi.python.org/pypi/Polygon/2.0.4, here is an example:

``````>>> import Polygon
>>> a = Polygon.Polygon([(0,0),(1,0),(0,1)])
>>> b = Polygon.Polygon([(0.3,0.3), (0.3, 0.6), (0.6, 0.3)])
>>> a & b
Polygon:
<0:Contour: [0:0.60, 0.30] [1:0.30, 0.30] [2:0.30, 0.60]>
``````

To convert 4 the result of cv2.findContours to Polygon 3 point format, you can:

``````points1 = contours[0].reshape(-1,2)
``````

This will convert 2 the shape from (N, 1, 2) to (N, 2)

Following 1 is a full example:

``````import Polygon
import cv2
import numpy as np
from scipy.misc import bytescale

y, x = np.ogrid[-2:2:100j, -2:2:100j]

f1 = bytescale(np.exp(-x**2 - y**2), low=0, high=255)
f2 = bytescale(np.exp(-(x+1)**2 - y**2), low=0, high=255)

c1, hierarchy = cv2.findContours((f1>120).astype(np.uint8),
cv2.cv.CV_RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)

c2, hierarchy = cv2.findContours((f2>120).astype(np.uint8),
cv2.cv.CV_RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)

points1 = c1[0].reshape(-1,2) # convert shape (n, 1, 2) to (n, 2)
points2 = c2[0].reshape(-1,2)

import pylab as pl
poly1 = pl.Polygon(points1, color="blue", alpha=0.5)
poly2 = pl.Polygon(points2, color="red", alpha=0.5)
pl.figure(figsize=(8,3))
ax = pl.subplot(121)
pl.xlim(0, 100)
pl.ylim(0, 100)

a = Polygon.Polygon(points1)
b = Polygon.Polygon(points2)
intersect = a&b # calculate the intersect polygon

poly3 = pl.Polygon(intersect[0], color="green") # intersect[0] are the points of the polygon
ax = pl.subplot(122)
pl.xlim(0, 100)
pl.ylim(0, 100)
pl.show()
``````

Output:

Score: 1

So this is what I did to get the job done:

``````import Polygon, numpy

# Here I extracted and combined some contours and created a convex hull from it.
# Now I wanna check whether a contour acquired differently intersects with this hull or not.

for contour in contours:  # The result of cv2.findContours is a list of contours
contour1 = contour.flatten()
contour1 = numpy.reshape(contour1, (int(contour1.shape[0]/2),-1))
poly1 = Polygon.Polygon(contour1)

hull = hull.flatten()  # This is the hull is previously constructued
hull = numpy.reshape(hull, (int(hull.shape[0]/2),-1))
poly2 = Polygon.Polygon(hull)

if (poly1 & poly2).area()<= some_max_val:
some_operations
``````

I 4 had to use for loop, and this altogether 3 looks a bit tedious, although it gives me 2 expected results. Any better methods would 1 be greatly appreciated!

More Related questions