Фильтровать 2d-массивы, содержащие 1d-массив внутри 3d-массива - PullRequest
0 голосов
/ 24 июня 2018

У меня есть 3d-массив (массив треугольников).Я хотел бы получить треугольники (2d массивы), содержащие заданную точку (1d массив).Я прошел in1d, где, argwhere, но я все еще неудачно ....

Например, с:

import numpy as np
import numpy.random as rd

t = rd.random_sample((10,3,3))

v0 = np.array([1,2,3])

t[1,2] = v0
t[5,0] = v0 
t[8,1] = v0

Я хотел бы получить:

array([[[[[ 0.87312   ,  0.33411403,  0.56808291],
          [ 0.36769417,  0.66884858,  0.99675896],
          [ 1.        ,  2.        ,  3.        ]],

         [[ 0.31995867,  0.58351034,  0.38731405],
          [ 1.        ,  2.        ,  3.        ],
          [ 0.04435288,  0.96613852,  0.83228402]],

         [[ 1.        ,  2.        ,  3.        ],
          [ 0.28647107,  0.95755263,  0.5378722 ],
          [ 0.73731078,  0.8777235 ,  0.75866665]]]])

чтобы затем получить набор из v0 смежных точек

{[ 0.87312   ,  0.33411403,  0.56808291],
 [ 0.36769417,  0.66884858,  0.99675896],
 [ 0.31995867,  0.58351034,  0.38731405],
 [ 0.04435288,  0.96613852,  0.83228402],
 [ 0.28647107,  0.95755263,  0.5378722 ],
 [ 0.73731078,  0.8777235 ,  0.75866665]}

без зацикливания, причем массив довольно большой.

Например,

In [28]: np.in1d(v0,t[8]).all()
Out[28]: True

работает как тест настрока, но я не могу получить это по всему массиву.Спасибо за вашу помощь.

Я имею в виду векторизованный эквивалент:

In[54]:[triangle for triangle in t if v0 in triangle ]
Out[54]: 
    [array([[ 0.87312   ,  0.33411403,  0.56808291],
            [ 0.36769417,  0.66884858,  0.99675896],
            [ 1.        ,  2.        ,  3.        ]]),
     array([[ 0.31995867,  0.58351034,  0.38731405],
            [ 1.        ,  2.        ,  3.        ],
            [ 0.04435288,  0.96613852,  0.83228402]]),
     array([[ 1.        ,  2.        ,  3.        ],
            [ 0.28647107,  0.95755263,  0.5378722 ],
            [ 0.73731078,  0.8777235 ,  0.75866665]])]

1 Ответ

0 голосов
/ 24 июня 2018

Вы можете просто сделать -

t[(t==v0).all(axis=-1).any(axis=-1)]

Мы выполняем уменьшение ALL и ANY вдоль последней оси с axis=-1 там.Сначала .all(axis=-1) ищет строки , точно совпадающие массив v0, а затем последний .any(axis=-1) ищет ANY совпадение в каждом из 2D блоки.Это приводит к логическому массиву той же длины, что и длина входного массива.Итак, мы используем логический массив для фильтрации допустимых элементов из входного массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...