Сохраните фрагмент массива 3D Numpy в качестве переменной

#python #numpy

#питон #тупица

Вопрос:

У меня есть различные 3D-массивы, которые я просматриваю 2D-фрагменты вдоль оси X, Y или Z.

Чтобы упростить свой код, я хотел бы иметь одно место для объявления среза, например

 # X View my_view = [10, :, :]  # Y View # my_view = [:, 4, :]  # Z View # my_view = [:, :, 7]  

и выберите, какое представление запускать в моем сценарии.

Затем остальная часть моего кода может применить срез myview при визуализации,

 plt.plot(my_data[myview]) plt.plot(more_data[myview])  

Нет никакого способа «сохранить» часть среза»:». Как бы я сделал это в Python/Numpy?

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

1. myview=(4, slice(None), slice(None)) и т.д.

Ответ №1:

np.s_ является удобным инструментом для создания индексирующего кортежа:

 In [21]: np.s_[10,:,:] Out[21]: (10, slice(None, None, None), slice(None, None, None))  

но вы можете создать это напрямую:

 In [22]: (10,slice(None),slice(None)) Out[22]: (10, slice(None, None, None), slice(None, None, None))  

arr[i,j] это то же самое arr[(i,j)] , что запятая создает кортеж.

 In [23]: 10,slice(None),slice(None) Out[23]: (10, slice(None, None, None), slice(None, None, None))  

Таким образом, вы можете создать более общий кортеж индексирования.

Ответ №2:

Почему бы не создать my_view функцию?

 def my_view(arr):  """Returns a certain 2d slice of a 3d NumPy array."""  # X View  return arr[10, :, :]   # Y View  # return arr[:, 4, :]   # Z View  # return arr[:, :, 7]  

Приложение:

 plt.plot(my_view(my_data)) plt.plot(my_view(more_data))