Как выбрать элементы из многомерного массива с помощью python : array[:][i][j]?

#python #arrays

#питон #массивы

Вопрос:

В Python у меня есть 3-мерный массив A :

 A=np.random.random((3,2,3))  print(A)  Out[6]: [[[0.89565135 0.79502322 0.89015957]  [0.40303084 0.80496231 0.50278239]]   [[0.70610822 0.61269108 0.00470925]  [0.29734101 0.67986295 0.34584381]]   [[0.71822397 0.99326199 0.40949422]  [0.97733739 0.38916931 0.91475145]]]   

Я хотел бы выбрать первый элемент каждой подматрицы и создать из них массив [0.89565135,0.70610822,0.71822397] , поэтому я попробовал следующую формулу : A[:][0][0],A[0][:][0],A[0][0][:] но все они дают мне один и тот же результат, который я не ожидаю…

 A[:][0][0] Out[7]: array([0.89565135, 0.79502322, 0.89015957])  A[0][:][0] Out[8]: array([0.89565135, 0.79502322, 0.89015957])  A[0][0][:] Out[9]: array([0.89565135, 0.79502322, 0.89015957])  

Какую формулу я могу использовать, чтобы получить правильный массив, и как вышеприведенная формула дает тот же результат ?

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

1. Сравните A[:,0,0] с A[0,:,0] и. A[0,0,:] Все еще идентичны?

Ответ №1:

Вы можете сделать следующее, чтобы выбрать для всего канала первый элемент матрицы:

 A[:, 0, 0]  

: ссылается на все каналы, 0 первую строку и 0 первый столбец.

Выход:

 array([0.89565135,0.70610822,0.71822397])  

Редактировать:

Если вы работаете с вложенными list , вы можете сделать следующее:

 [array[0][0]for array in A]  

Это показывает одно из преимуществ numpy array перед python list , поскольку выбор намного проще (и быстрее) в использовании numpy .

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

1. Но все же, если я напишу массив напрямую, а не как массив numpy : A=[[[0.89565135, 0.79502322, 0.89015957], [0.40303084, 0.80496231, 0.50278239]], [[0.70610822, 0.61269108, 0.00470925], [0.29734101, 0.67986295, 0.34584381]], [[0.71822397, 0.99326199, 0.40949422], [0.97733739, 0.38916931, 0.91475145]]] проблема остается. У вас есть какая-нибудь идея на этот счет ?

2. Я добавил решение с использованием вложенных list . Однако я бы посоветовал выполнить эту операцию с numpy , так как она намного эффективнее.

Ответ №2:

Ваша идея индексирования здесь немного ошибочна, когда вы делаете A[:][0][0] то, что вы делаете, это A[:] будет означать в основном всю матрицу, из которой вы указываете первый индекс, используя A[:][0] который будет

 [[0.89565135 0.79502322 0.89015957]  [0.40303084 0.80496231 0.50278239]]  

из которых вы дополнительно указываете первый индекс A[:][0][0] , который даст вам первую строку

 [0.89565135 0.79502322 0.89015957]  

Следуя аналогичной логике, вы можете видеть, что во второй схеме индексирования вы эффективно делаете то же самое. Что вам нужно сделать, так это сделать

 A[0][0][0]  A[1][0][0]  A[2][0][0]  

которые вы можете написать коротким почерком

 A[:,0,0]