Нарезка сетки неизвестных размеров

#python #numpy #numpy-ndarray

#python #numpy #numpy-ndarray

Вопрос:

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

 def generate_random_grid(n_scanning_parameters,n_points_each_dimension):
  points=np.linspace(1,0,num=n_points_each_dimension,endpoint=False)
  x_points=[points for dimension in range(n_scanning_parameters)]
  mesh=np.array(np.meshgrid(*x_points))
  return mesh
  

Как вы можете видеть, я не знаю размеры заранее. Поэтому позже, когда я захочу проиндексировать сетку, чтобы предсказать разные точки, я не знаю, как индексировать.
Например, если у меня есть 4 измерения и 10 точек вдоль каждого измерения, сетка имеет форму (4,10,10,10,10). И мне нужно получить доступ к таким точкам, как, например [:,0,0,0,0] или [:,1,2,3,4]. Что дало бы мне одномерный вектор с 4 элементами.
Теперь я могу создать 4 последних индекса, используя

for index in np.ndindex(*mesh.shape[1:]):

, но затем индексирование моей сетки подобным mesh[:,index] образом не приводит к одномерному вектору с 4 элементами, как я ожидаю.

Как я могу проиндексировать сетку?

Ответ №1:

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

По сути, вы хотите выполнить нарезку a[:, 0, 0, 0, 0] следующим образом. Но ваш индекс представляет собой кортеж, и вы пытаетесь сделать что-то вроде a[:, (0,0,0,0)] — это дает вам четыре гиперплоскости вдоль второго измерения вместо этого. Ваша индексация должна быть больше похожа a[(:,0,0,0,0)] — но это выдает синтаксическую ошибку.

Таким образом, решением было бы использовать slice встроенный.

 a[(slice(None),0,0,0,0)]
  

Это даст вам ваш одномерный вектор.

С точки зрения вашего кода, вы можете просто добавить кортежи, чтобы заставить это работать.

 for index in np.ndindex(*mesh.shape[1:]):
    vector = mesh[(slice(None), )   index]
  

Альтернативным подходом было бы просто использовать транспонированный массив и перевернутые индексы. Первое измерение находится в конце, что устраняет необходимость в : .

 for index in np.ndindex(*mesh.shape[1:]):
    vector = mesh.T[index[::-1]]