Как проиндексировать второй-последний ряд numpy array-python - PullRequest
0 голосов
/ 27 апреля 2019

Я хочу проиндексировать вторую и последнюю строку массива numpy. У меня есть цикл, который постоянно добавляет новые строки:

arr2= is an array formatted like so [[300 240 22 22]] 

, поэтому в приведенном выше примере x = 300 y = 240 w = 22 h= 22 * ​​1004 * эти числа обрабатываются в уравнении до тех пор, пока wm не будет иметь 2 числа, поэтому [200, 300] и hm также имеют 2 числа [200, 300], и оба не будут добавлены в конец arr (без созданияновые массивы, а скорее добавление к одному массиву. Таким образом, это будет выглядеть примерно так: постоянно добавляются новые строки (я не знаю, добавляет ли он новые строки или переопределяет старые значения):

----row [[301.77325 225.71806][366.08594 232.20958]]
----row [[301.54193 225.93848][365.76663 232.37358]]
---- [[300.9011  225.27153][365.21063 231.52242]]second to last appended 
row 
---- [[300.63205 223.20387][364.91928 229.46263]]last appended row
then there would be another row being appended this is just a snapshot

code:

arr=[] #shape is (0,)
for (x, y, w, h) in arr2:
    wm=int(x + (w/2))
    hm=int(y + (h/2))
    arr.append([wm, hm])

simplified version:   
arr=[]
for (x, w) in arr2:
    wm=int(x + (w/2))
    arr.append([wm])

Неупрощенный код создает массив формы (2,2) с типом d: float32.

column (wm) column(hm)
   |            |
   |            |
[[293.51373 323.4329 ] # second to last row
 [247.77493 316.02783]]

[[292.9887  322.23425]
 [247.24142 314.2921 ]]

Вот некоторые примеры методов индексации Iпробовал (вместе с массивом) (это две последние добавленные строки массива):

arr [[255.44836 280.92575] # I want to index this line-second to last appended row
     [298.6107  285.75986]]

arr[-1] [298.6107  285.75986]
arr[-2] [255.44836 280.92575]
arr[-2][0] 255.44836
arr[:,0] [255.44836 298.6107 ]
arr[-1,:] [298.6107  285.75986]
arr[-2,0] 255.44836
arr[-2::2] [255.44836 280.92575] 

arr [[255.35194 281.08353] # along with this line-last appended row
     [298.45673 285.88693]]

arr[-1] [298.45673 285.88693]
arr[-2] [255.35194 281.08353]
arr[-2][0] 255.35194
arr[:,0] [255.35194 298.45673]
arr[-1,:] [298.45673 285.88693]
arr[-2,0] 255.35194
arr[-2::2] [255.35194 281.08353]

В других случаях, когда я пытаюсь проиндексировать вторую или последнюю строку, это показывает мне ошибку оси,что может быть проблемой (что добавление не добавляет новый рочто я пытаюсь индексировать, но переопределяет старые значения).Я не знаю.Поэтому я попытался переключить метод добавления с помощью: concatenate, vstack, pandas.Но это не помогло.Все, что я хочу сделать, это найти разницу между последней и второй добавленной строкой от второго столбца в элементе wm (в примере 280.92575-281.08353), а также то же самое с первым столбцом элемента wm (255.44836-255.35194).).Все различные методы индексации не извлекали вторую-последнюю строку только последнюю строку.Пожалуйста, дайте мне знать, если есть другой способ индексации второй и последней строки другим способом или есть другие методы индексации, которые я еще не пробовал.Извините, если это сбивает с толку, все еще овладеваю этим.Я могу попытаться устранить любую путаницу.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019

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

  In [49]: arr
  Out[49]: 
  array([[255.44836, 280.92575],
         [298.6107 , 285.75986],
         [255.35194, 281.08353],
         [298.45673, 285.88693]])

In [50]: arr[0] - arr[-2]
Out[50]: array([ 0.09642, -0.15778])

# accessing elements in a `forward manner`
In [51]: arr[0] - arr[2]
Out[51]: array([ 0.09642, -0.15778])

# accessing elements in a `reverse manner` using negative indices
In [52]: arr[-4] - arr[-2]
Out[52]: array([ 0.09642, -0.15778])

# or mix both
In [50]: arr[0] - arr[-2]
Out[50]: array([ 0.09642, -0.15778])

Вы можете использовать либо прямое индексирование, либо обратное индексирование, либо смешанное, в зависимости от того, что удобно.

0 голосов
/ 27 апреля 2019

Если вы хотите проиндексировать последний элемент списка, используйте

arr[-1]

Если вы хотите проиндексировать второй или последний элемент, используйте

arr[-2]

Однако убедитесь, что ваш массив достаточно длинный. Если в вашем массиве есть только 1 элемент и вы хотите проиндексировать второй или последний элемент, это приведет к ошибке.

...