Как индексировать в массиве в Python для цикла? - PullRequest
0 голосов
/ 18 апреля 2019

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

У меня есть два массива:

    S = [[4.21287783e-03 7.83625813e-03 1.42038926e-02 ... 3.15416197e-03
      1.37110355e-03 9.45473448e-04]
     [1.94774282e-03 1.36746081e-03 1.23485391e-03 ... 6.21054272e-04
      5.31808587e-04 1.78796272e-04]
     [1.20601337e-03 2.81822793e-04 6.32125664e-04 ... 2.72966598e-04
      3.88162201e-04 1.89432902e-04]
     ...
     [7.39537451e-05 1.20665168e-04 1.54863119e-04 ... 3.05247233e-04
      2.26473099e-04 1.56650857e-04]
     [9.29507556e-05 6.45091024e-05 9.84829924e-05 ... 3.07827294e-04
      2.33815251e-04 1.52187484e-04]
     [4.66322444e-05 3.16681323e-05 7.08467828e-05 ... 1.44890351e-04
      7.91870831e-05 5.80408583e-05]]

    frames = [ 1  2  3  4  5  6  7  8  9 ]

Я перебираю свой массив кадров, но хочуитеративно выполнить вычисление для единственного значения (индексируемого с помощью i) из массива S:

    for i in frames:
          np.log(S[:,i])

Но я получаю ошибку "за пределами границ" ('индекс 9 выходит за пределы для оси 1 сразмер 9 '), потому что я индексирует до конца кадров.Я попытался:

    np.log(S[:,(i-1)])

, который не работал - либо потому, что мой синтаксис неверен, либо моя логика неверна.

Я также попытался:

      for i in frames:
          i=i-1
          np.log(S[:,i])

Иполучить то же самое из-за ошибки.

РЕДАКТИРОВАТЬ: Я уверен, что я могу вызвать S таким образом, потому что я делаю это в другом месте в сценарии (и может подставить любое целое число для i, и сценарий выполняется).Моя логика использования i в качестве индекса неверна.

Ответы [ 4 ]

2 голосов
/ 18 апреля 2019

С двумя заданными вами списками (вы пишете о arrays, но копирование-вставка вашего кода создает списки):

In [30]: S = [23, 23.3, 34.2, 235, 23.1, 32.1, 23, 75, 4] 
    ...: frames = [1, 2, 3, 4, 5, 6, 7, 8, 9]                                        
In [31]: for i in frames: 
    ...:     print(S[:,i]) 
    ...:                                                                             
TypeError: list indices must be integers or slices, not tuple

Вы не можете использовать [:,i] индексирование сlists.

In [32]: for i in frames: 
    ...:     print(S[i]) 
    ..:                                                                             
23.3
34.2
235
23.1
32.1
23
75
4
---------------------------------------------------------------------------
IndexError: list index out of range

С frames вы пропускаете первый элемент S и получаете ошибку с последним индексом.Индексирование Python начинается с 0!

Даже если я создаю пустой массив, ваша индексация неверна:

In [33]: arr = np.array(S)                                                           
In [34]: for i in frames: 
    ...:     print(arr[:,i]) 
    ...:                                                                             

IndexError: too many indices for array

arr равен 1d, shape (9,).Вы не можете использовать [:, i] `с этим.

Вы хотите выбрать часть S (или arr), например, первые 3 элемента?

In [36]: arr[:3]                                                                     
Out[36]: array([23. , 23.3, 34.2])
In [37]: np.log(arr[:3])                                                             
Out[37]: array([3.13549422, 3.14845336, 3.53222564])

[:3] индексы a slice (как для списка, так и для массивов)

Если массив 2d, то вы можете использовать запись [:,i]:

In [38]: A = arr.reshape(3,3)                                                        
In [39]: A                                                                           
Out[39]: 
array([[ 23. ,  23.3,  34.2],
       [235. ,  23.1,  32.1],
       [ 23. ,  75. ,   4. ]])
In [40]: A[:,0]                       # first column                                               
Out[40]: array([ 23., 235.,  23.])
0 голосов
/ 18 апреля 2019

Вы можете удалить «9» в массиве кадров, и вы увидите результат, как показано ниже:

23.3
34.2
235
23.1
32.1
23
75
4

Итак, теперь вы знаете, что индекс массива начинается с 0, а не с 1. если вы хотите это исправить, вам нужно заменить массив frames:

frames = [0, 1, 2, 3, 4, 5, 6, 7, 8]
0 голосов
/ 18 апреля 2019

У вас есть лишняя запятая.

Попробуйте:

for i in frames:
      np.log(S[:i])

Мой тест:

$ python3
Python 3.7.2+ (default, Feb 27 2019, 15:41:59) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> S = [23, 23.3, 34.2, 235, 23.1, 32.1, 23, 75, 4]
>>> frames = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for i in frames:
...     print(S[:i])
... 
[23]
[23, 23.3]
[23, 23.3, 34.2]
[23, 23.3, 34.2, 235]
[23, 23.3, 34.2, 235, 23.1]
[23, 23.3, 34.2, 235, 23.1, 32.1]
[23, 23.3, 34.2, 235, 23.1, 32.1, 23]
[23, 23.3, 34.2, 235, 23.1, 32.1, 23, 75]
[23, 23.3, 34.2, 235, 23.1, 32.1, 23, 75, 4]
>>> 
0 голосов
/ 18 апреля 2019

Лично я думаю, что вам не нужно использовать frames для индексации S.Вы можете попробовать это так:

for i in range(S.shape[0])
    np.log(S[i])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...