#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]]