Трудно найти четкое название, но пример будет ясно. Например, мои данные:
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? Или мне нужно использовать некоторые методы интерполяции... Скорость и память беспокоятся здесь, потому что я должен делать это много раз, и массивы могут быть действительно большими.
Спасибо за понимание!
Создайте индексы 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]])
ogrid
- это открытая сетка с массивами (4,1) и (1,3). Так что в них нет ничего особенно дорогого. Вам просто нужна пара, которая вещает с вашим ix
. np.ix_(range(4), range(3))
создает ту же пару.
c.shape[2]
всегда равен2
?