У меня есть 3D numpy массив точек измерений [10000x3000x128] , где первое измерение - это число кадров, второе измерение - это число точек в каждом кадре, а третье измерение - это 128. элемент вектора, связанный с каждой точкой. Я хочу эффективно фильтровать точки в каждом кадре, используя булеву 2D маску измерений [10000x3000], и для каждой из выбранных точек также взять связанный 128-мерный вектор объектов. Кроме того, в выводе мне нужен еще трехмерный вектор , а не объединенный 2D-вектор и, возможно, , избегайте любого для l oop. На самом деле то, что я делаю:
# example of points
points = np.array([10000, 3000, 128])
# fg, bg = 2D dimensional boolean np.array
# init empty lists
fg_points, bg_points = [], []
for i in range(points.shape[0]):
fg_mask_tmp, bg_mask_tmp = fg[i], bg[i]
fg_points.append(points[i,fg_mask_tmp,:])
bg_points.append(points[i,bg_mask_tmp,:])
fg_features, bg_features = np.array(fg_points), np.array(bg_points)
Но это довольно наивное решение, которое наверняка можно улучшить более numpy -подобным способом. Кроме того, я также попробовал другие решения, такие как:
fg_features = points[fg,:]
Но это решение не сохраняет размеры массива, объединяющего два первых измерения, поскольку число отфильтрованных точек для каждого кадра может варьироваться . Другое решение, которое я попробовал, состоит в увеличении 2D-масок путем добавления истинного значения [128] к последнему измерению, но с любым успешным результатом. Кто-нибудь знает возможное эффективное решение?
Заранее спасибо за любую помощь!