Numpy уникальных треугольников в сетке - PullRequest
0 голосов
/ 24 августа 2018

У меня есть сетка из треугольников, хранящихся в NumPy.Некоторые треугольники являются дубликатами, и я хочу удалить их.Пример моего массива:

# Some points
a=(-2,-2,0)
b=(1,-2,0)
c=(1, 1,0)
d=(-2,1,0)
e=(-2,-2,1)
f=(1,-2,1)
g=(1,1,1)
h=(-2,1,1)

# Some triangles
t1=(a,b,c)
t2=(c,d,a)
t3=(e,f,g)
t4=(g,h,e)

# The numpy array with duplicated t1 and t3
points=numpy.array([t1,t2,t3,t4,t1,t3])

Я попытался использовать intersect1d и unique, но не смог найти способ удалить все треугольники, которые встречаются более одного раза.Чего мне не хватает?

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Предполагая, что порядок вершин не имеет значения, вы можете сначала отсортировать вершины, а затем удалить повторяющиеся треугольники, используя метод, аналогичный приведенному ниже: Удаление дублирующихся столбцов и строк из 2D-массива NumPy

def unique_triangles(points):
    points = np.sort(points,axis=1)
    unique_points = np.unique(points.flatten().view([('',points.dtype)]*points.shape[1]*points.shape[2]))
    return unique_points.view(points.dtype).reshape((-1,points.shape[1],points.shape[2]))

Пример:

>>> unique_triangles(points)
array([[[-2, -2,  0],
        [ 1, -2,  0],
        [ 1,  1,  0]],

       [[-2, -2,  1],
        [ 1, -2,  1],
        [ 1,  1,  1]],

       [[ 1,  1,  0],
        [-2,  1,  0],
        [-2, -2,  0]],

       [[ 1,  1,  1],
        [-2,  1,  1],
        [-2, -2,  1]]])
0 голосов
/ 25 августа 2018

Именно эта проблема и стала первым мотиватором, который побудил меня создать пакет numpy_indexed :

import numpy_indexed as npi
npi.unique(triangles)

С тех пор он стал охватывать гораздо больше вещей.Но также, с тех пор numpy добавил аргумент оси к уникальному

np.unique(triangles, axis=0)

Должен выполнить то же самое, в основном с теми же основными операциями, которые выполняются.npi.unique также имеет аргумент оси, но по умолчанию его 0.

0 голосов
/ 24 августа 2018

Решение состоит в том, чтобы построить набор треугольников и сделать так, чтобы точки каждого треугольника были отсортированы первыми:

# Some points
a=(-2,-2,0)
b=(1,-2,0)
c=(1, 1,0)
d=(-2,1,0)
e=(-2,-2,1)
f=(1,-2,1)
g=(1,1,1)
h=(-2,1,1)

# Some triangles
t1=(a,b,c)
t2=(c,d,a)
t3=(e,f,g)
t4=(g,h,e)

# The numpy array with duplicated t1 and t3
triangles = [t1,t2,t3,t4,t1,t3]

set( tuple(sorted(points)) for points in triangles )

дает:

{((-2, -2, 0), (-2, 1, 0), (1, 1, 0)),
 ((-2, -2, 0), (1, -2, 0), (1, 1, 0)),
 ((-2, -2, 1), (-2, 1, 1), (1, 1, 1)),
 ((-2, -2, 1), (1, -2, 1), (1, 1, 1))}
...