Эффективный выбор вектора в numpy

#python #numpy

#python #numpy

Вопрос:

Существует ли эффективный механизм numpy для генерации массива значений из 2D-массива с учетом списка индексов в этом массиве?

В частности, у меня есть список 2D координат, которые представляют интересные значения в 2D numpy массиве. Я вычисляю эти координаты следующим образом:

 nonzeroValidIndices = numpy.where((array2d != noDataValue) amp; (array2d != 0))
nonzeroValidCoordinates = zip(nonzeroValidIndices[0],nonzeroValidIndices[1])
  

Оттуда я создаю карту, перебирая координаты и индексируя в массив numpy по одному за раз, аналогично этому упрощенному примеру:

 for coord in nonzeroValidCoordinates:       
    map[coord] = array2d[coord]
  

У меня есть несколько массивных наборов данных, над которыми я повторяю этот алгоритм, поэтому меня интересует эффективное решение. Я подозреваю, что из-за профилирования эта array2d[coord] строка вызывает некоторую боль. Есть ли лучшая векторная форма для генерации всего вектора значений из array2d или я застрял с индексацией по одному за раз?

Ответ №1:

Как насчет чего-то подобного:

 a = np.arange(100).reshape((10,10))
ii = np.where(a > 27) # your nonzeroValidIndices
b = np.zeros_like(a) # your map
b[ii] = a[ii]
  

Вы можете использовать результат np.where для индексации массива, как я показал выше. Это должно привести к чему-то подобному тому, что вы делаете без зацикливания, но я не совсем понимаю, каким на самом деле должен быть ваш целевой 2D-массив из вашего вопроса. Не зная, что такое map , кажется, что вы копируете данные в массив того же размера.

Комментарии:

1. Я понял слово map как словарь. Это то, что ты имел в виду @Rich?

Ответ №2:

Да, конечно, вы можете получить значения в виде

 nonZeroData = array2d[nonzeroValidIndices]
  

если map — это новый dict, вы могли бы сделать

 map = dict(zip(nonzeroValidCoordinates,nonZeroData))
  

Если это существующий dict,

 map.update(zip(nonzeroValidCoordinates,nonZeroData))
  

Если это массив, то

 map[nonzeroValidIndices] = nonZeroData
  

Ответ №3:

Я думаю, вы могли бы попробовать что-то вроде:

 array2d[ix_(nonzeroValidIndices[0],nonzeroValidIndices[1])]
  

Или, если вы действительно хотите использовать nonzeroValidCoordinates :

 unzip = lambda l: [list(li) for li in zip(*l)]
array2d[ix_(unzip(nonzeroValidCoordinates))]
  

Источник: Ссылка