#python #numpy
Вопрос:
Допустим, у меня есть 3-мерный массив Numpy. Это ежедневные данные за год и пиксели 1 градуса земного шара, в результате чего получается форма (365, 180, 360).
Теперь вы хотите вставить значение 16 января в его позицию, чтобы каждый временной ряд становился:
…val_0114, val_0115, val_0116, val_0116, val_0117, val_0118, …
Я мог бы сделать это так:
arr_new = np.empty((arr_old.shape[0], 180, 360)) * np.nan
for _lat in range(arr_new.shape[1]):
for _lon in range(arr_new.shape[2]):
arr_new[:, _lat, _lon] = np.insert(arr_old, 15, arr_old[15, _lat, _lon], axis=0)
Но я хотел бы найти более причудливый способ без петли.
Комментарии:
1. вы уверены, что хотите вставить? ваши данные уже имеют хорошую форму и
insert
меняют форму2. да, желаемая форма 366*180*360
3. хорошо, спасибо. и вы хотите сделать вставку в старые данные?
4. ДА. Например, если старые данные являются [0, 1, 2, 3, 4, 5] тогда я хочу получить что-то вроде [0, 1, 2, 3, 4, 4, 5]
Ответ №1:
В numpy вам разрешено напрямую ссылаться на матрицу. Это похоже на работу с многомерными списками:
# If you want to place the same temperature in the whole world/pixels
arr_old[16] = 15
# If you want to place the same temperature in a certain place the whole year
arr_old[:][lat][lon]
Комментарии:
1. Спасибо вам за ваш ответ и поздравляю с первым вкладом. Я хочу вставить значение, чтобы форма была изменена на 366*180*360. Тем не менее, сработал бы ваш ответ?
2. Судя по моему тесту, у тебя почти получилось. Используйте только вставку numpy следующим образом:
a = np.insert(a,0,np.nan,axis=0)
если вы используете ось,чтобы определить,какую часть массива вы хотите (время, y, x), то 0-это начальная точка, в которой она добавляет новые значения, а np.nan-это добавляемое значение. Надеюсь, теперь это имеет смысл.3. Да, это то, что я нашел. Проблема в том, что мне нужно применить его ко всем пикселям. Вот почему я использовал петлю. Теперь я хочу найти способ применить его ко всем пикселям без цикла.