замена значений вдоль заданной оси

#python #numpy

#python #numpy

Вопрос:

Рассмотрим следующие данные:

  • гиперкуб numpy, например x = np.random.rand(8, 8, 8, 8)
  • индекс измерения, например dim = 1
  • заменяющий массив, например y = np.random.rand(8)

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

т.е. могу ли я сделать лучше, чем:

 if dim == 0:
    x[0,:,:,:] = y
elif dim == 1:
    x[:,0,:,:] = y
elif dim == 2:
    x[:,:,0,:] = y
elif dim == 3:
    x[:,:,:,0] = y
else:
    throw
  

Ответ №1:

Вы можете создать индексный кортеж с помощью выражения генератора:

 x[tuple(0 if i == dim else slice(None) for i in range(4))] = y
  

Более подробная версия:

 index = [slice(None)] * len(x.shape)
index[dim] = 0
x[tuple(index)] = y
  

Ответ №2:

Вы можете переместить затемненную ось вперед:

 np.moveaxis(x, dim, 0)[0] = y