Есть ли лучший способ получить элементы с координатами x, y из массива numpy?

Массив numpy можно проиндексировать кортежем последовательностей таким образом, что tpl[0] — это последовательность координат x, а tple[1] — последовательность координат y. Просто нужно проиндексировать массив кортежем, таким образом: other_array[tpl].

В настоящее время у меня есть координаты, хранящиеся в двумерном массиве, так что вектор ar[0] соответствует моим значениям x, а ar[1] соответствует моим значениям y.

Прямо сейчас я индексирую other_array, создавая кортеж: other_array((ar[0], ar[1])). К сожалению, эта операция выполняется в жестком цикле, поэтому любое количество производительности, которое я могу выжать, было бы очень полезно. Создание кортежа может добавить немного накладных расходов, если выполняется 10^8 раз! Есть ли более быстрый, нумпитоновский способ индексации с такой матрицей координат xy?

Большое спасибо!


person Louis Thibault    schedule 20.04.2013    source источник
comment
Интересно, могут ли быть лучшие способы оптимизировать ваш узкий цикл - каким-то образом работа со всем массивом обычно намного быстрее, чем с одним элементом за раз. Возможно, показ вашего внутреннего цикла и объяснение того, что он делает, принесет вам большую выгоду...   -  person Floris    schedule 20.04.2013
comment
@Floris, действительно, я стараюсь работать с массивами, используя логическое индексирование, а не циклы.   -  person Louis Thibault    schedule 20.04.2013


Ответы (1)


Вы можете индексировать массив numpy с другим массивом, поэтому вам не нужно создавать кортеж. Например:

In [199]: other_array
Out[199]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

In [200]: ar
Out[200]: 
array([[0, 2, 1],
       [1, 3, 0]])

In [201]: other_array[ar[0], ar[1]]
Out[201]: array([ 1, 13,  5])

Если это не отвечает на ваш вопрос, не могли бы вы включить в свой вопрос простой рабочий пример, показывающий, что вы сейчас делаете?

person Warren Weckesser    schedule 20.04.2013
comment
Хотя вы явно не создаете кортеж, other_array.__getitem__ получает в качестве аргумента кортеж (ar[0], ar[1]), поэтому кортеж все равно создается. Это не имеет большого значения, потому что опасения OP по поводу создания двухэлементного кортежа необоснованны: даже если каждый элемент представляет собой массив с миллиардом элементов, кортеж состоит только из двух указателей. - person Jaime; 20.04.2013