#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))