Каков наилучший способ обрезать сцену из массива numpy 3D-точек. Т.е. найти точки в облаке точек, которые лежат в определенных границах - PullRequest
0 голосов
/ 15 января 2020

этот вопрос может быть сформулирован более запутанно, чем он есть, поскольку я уверен, что решение довольно обобщенно c.

Ситуация следующая. Нам дан массив numpy (n, 3), где n - количество точек, указанных в трехмерных координатах (x, y, z). Теперь я хочу создать срез этого массива, который содержит все точки падения в определенной области. Например, значение x между -50 и 50 и значение z ниже 10.

Я, конечно, могу перебрать весь массив и проверить условия для каждой точки, однако, я подозреваю, что некоторые numpy Маги c существует, что делает эту операцию намного быстрее. Может быть, вы можете помочь мне придумать идею.

Спасибо! :)

for x,y,z in points:
    if x >= x_lower and x <= x_upper and y >= y_lower and y <= y_upper and z.... and so on:
        #keep this point

1 Ответ

1 голос
/ 15 января 2020

Вы можете использовать np.where для анализа нескольких сравнений, например, так:

импорт numpy как np

a = np.array([[0, 0, 0],
              [1, 2, 3],
              [6, 7, 7],
              [9, 0, 0],
              [0, 9, 0],
              [0, 0, 9],
              [-10, 0, 0]])

print(a[(a[:, 0] < 8 ) & (a[:, 0] >= 0) & (a[:, 1] < 8) & (a[:, 1] >= 0) & (a[:, 2] < 8) & (a[:, 2] >= 0)])
>>>[[0 0 0]
    [1 2 3]
    [6 7 7]]

Как это работает, если что, если любое из утверждений:

  1. (a [:, 0] <8) </li>
  2. (a [:, 0]> = 0)
  3. (a [:, 1] <8 ) </li>
  4. (a [:, 1]> = 0)
  5. (a [:, 2] <8) </li>
  6. (a [:, 2]> = 0 ))

- это False, он вернет значение False, если любое из них равно False, побитовый компаратор возвращает значение False для всего оператора (подробнее см. 'и' (булево) против '&' (поразрядно) - Почему разница в поведении со списками против numpy массивов? ).

Это должно быть достаточно быстро, для массива длиной 10000000, это займет у меня 0,43 секунды до запуска.

...