Работая в NumPy, я понимаю, как нарезать 2D-массивы из 3D-массива, используя эта статья.
В зависимости от оси, которую я хотел бы разрезать:
array = [[[0 1 2]
[3 4 5]
[6 7 8]]
[[9 10 11]
[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]
[24 25 26]]]
Нарезка даст мне:
i_slice = array[0]
[[0 1 2]
[3 4 5]
[6 7 8]]
j_slice = array[:, 0]
[[0 1 2]
[9 10 11]
[18 19 20]]
k_slice = array[:, :, 0]
[[0 3 6]
[9 12 15]
[18 21 24]]
Но можно ли разрезать под углом 45 градусов? например:
j_slice_down = array[slice going down starting from index 0]
[[0 1 2]
[12 13 14]
[24 25 26]]
Я смог добиться этого по всем трем осям, идущим вверх или вниз, и даже полностью обернутым... в дни темного списка со многими циклами for... но я уверен, что в NumPy должен быть лучший способ .
Обновление, выбранный ответ:
Я выбрал ответ hpaulj, создав два массива координат с помощью np.arrange
. Немного поработав, я смог сделать так, чтобы он соответствовал моим потребностям: возвращать срез под любым углом, по любой оси, асимметричному измерению трехмерного массива и в любом положении, включая обертывание по всему периметру, чтобы это было одно и то же измерение. как ось.
Два массива np.arrange
были сделаны для x
и y
.
Различные методы, такие как np.roll
, приращение, np.hstack
и np.concatenate
, были выполнены для массива оси x массива np.arrange
. y = y[::-1]
для альтернативного угла.
if axis is 'z': #i
slice_notation = np.index_exp[x, y, :]
elif axis is 'y': #k
slice_notation = np.index_exp[x, :, y]
else: #j
slice_notation = np.index_exp[:, x, y]
Создает выражение среза, затем я использую slice_notation
для выполнения необходимых операций на месте.
Другие предложенные методы: np.diagonal
и np.eye
могут быть более подходящими для других, поскольку у них могут быть другие требования, чем у меня.
a[np.eye(len(a),dtype=bool)]
сa
в качестве входного массива? - person Divakar   schedule 18.02.2019einsum
должен быть более эффективным:np.einsum('iij->ij',a)
. - person Divakar   schedule 18.02.2019