Выберите индексы в массивах по определенным параметрам [дубликаты]

1

Трудно найти четкое название, но пример будет ясно. Например, мои данные:

c = np.full((4, 3, 2), 5)
c[:,:,1] *= 2

ix = np.random.randint(0, 2, (4, 3))

если ix:

array([[1, 0, 1],
       [0, 0, 1],
       [0, 0, 1],
       [1, 1, 0]])

если хотите в результате:

array([[10,  5, 10],
       [ 5,  5, 10],
       [ 5,  5, 10],
       [10, 10,  5]])

Мой массив c может иметь произвольные размеры, а также размер, который я хочу пробовать.

Это звучит как интерполяция, но я не хочу создавать массив индексов каждый раз, когда я хочу применить это. Есть ли способ сделать это, используя некоторую индексацию на массивах numpy? Или мне нужно использовать некоторые методы интерполяции... Скорость и память беспокоятся здесь, потому что я должен делать это много раз, и массивы могут быть действительно большими.

Спасибо за понимание!

  • 0
    Итак, c.shape[2] всегда равен 2 ?
  • 0
    Нет, это может быть произвольное число ...
Теги:
arrays
numpy
indexing

1 ответ

3
Лучший ответ

Создайте индексы x, y с numpy.ogrid, а затем используйте расширенную индексацию:

idx, idy = np.ogrid[:c.shape[0], :c.shape[1]]
c[idx, idy, ix]

#array([[10,  5, 10],
#       [ 5,  5, 10],
#       [ 5,  5, 10],
#       [10, 10,  5]])
  • 0
    Спасибо за ответ! Мне было интересно, смогу ли я избежать создания сетки ... Но у меня нет другого решения, я приму ваше!
  • 0
    ogrid - это открытая сетка с массивами (4,1) и (1,3). Так что в них нет ничего особенно дорогого. Вам просто нужна пара, которая вещает с вашим ix . np.ix_(range(4), range(3)) создает ту же пару.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню