Как векторизовать операции над несколькими строками в матрице с NumPy - PullRequest
1 голос
/ 07 ноября 2019

Я работаю с Trimesh и пытаюсь вычислить статистику по сеткам. Одной из возможных статистических данных (и той, которую я использую для иллюстрации вопроса) является гистограмма областей 3 случайных вершин сетки. В настоящее время я делаю следующее, но я хотел бы знать, есть ли способ избежать использования цикла.

def CalcArea(self, p):
    return 0.5 * np.linalg.norm(np.cross(p[1]-p[0], p[2]-p[0]))

v_c = self.mesh.vertices.copy()
np.random.shuffle(v_c)
areas = [self.CalcArea(v_c[i:i+3]) for i in range(len(v_c[:-2]))]

1 Ответ

0 голосов
/ 07 ноября 2019

Документация numpy является вашим другом: -).

np.cross и np.linalg.norm также работают с массивами векторов. И они поддерживают мощный ключевой аргумент axis.

Я предполагаю, что ваш v_c имеет форму (N, 3), где N - ваше количество вершин. Давайте для простоты предположим, что это кратно трем, тогда:

N = 30
v_c = np.random.random((N, 3))
v1 = v_c[N//3:2*N//3, :] - v_c[:N//3, :]
v2 = v_c[2*N//3:, :] - v_c[:N//3, :]
area = 0.5*np.linalg.norm(np.cross(v1, v2), axis=1)

Обратите внимание, что это включает создание временных массивов, поэтому, возможно, следите за очень большими N.

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