#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))]
Источник: Ссылка