Вставьте значения в определенном месте для каждого временного ряда пикселей с помощью массива Numpy

#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. Да, это то, что я нашел. Проблема в том, что мне нужно применить его ко всем пикселям. Вот почему я использовал петлю. Теперь я хочу найти способ применить его ко всем пикселям без цикла.