Как проиндексировать предпоследнюю строку массива numpy-python

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

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

так что в примере выше x=300 y=240 w=22 h=22
эти числа обрабатываются в уравнении до тех пор, пока wm не будет иметь 2 числа, поэтому [200, 300] и hm также имеют 2 числа [200, 300], и оба NON-STOP добавляются в конец 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

код:

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) с типом dtype: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 ]]

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

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]?

mkrieger1 27.04.2019 20:01

Похоже, вы пытаетесь нарисовать ограничивающую рамку. не могли бы вы привести простой и понятный пример? Этот не..

kmario23 27.04.2019 20:13

@mkrieger1 [-2] индексирует последнюю строку (255.35194 281.08353), а не предпоследнюю строку (255.44836 280.92575)

Deve1opper 28.04.2019 20:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
19 680
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

arr[-1]

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

arr[-2]

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

Ну, для других массивов [-1] и [-2] будут работать, так что у вас есть правильное представление, но для меня они не индексируют правильные вещи. Как показано в приведенных выше примерах.

Deve1opper 28.04.2019 21:37

Можете ли вы привести пример «arr» и что именно вы хотите проиндексировать?

slin 28.04.2019 21:49

Что ж, привести пример немного сложно, потому что он всегда обновляется, поэтому, если я сделаю снимок одного раздела, люди думают, что это весь массив, но это только последняя добавленная строка, поэтому (каждый --arr указывает новую строку): ----arr [[273.5383 203.26279] [339.77667 209.72774]]-third last ----arr [[273.3976 203.5339 ] [339.6704 209.93922]]-second last ----arr [[273.3121 203.85924] [339.57697 210.15872]] - last appended row

Deve1opper 03.05.2019 03:15

Я полагаю, это потому, что мой массив имеет размер 2, но ось 0. Поэтому, если я хочу индексировать 2, он получает IndexError: индекс 2 выходит за пределы оси 0 с размером 2.

Deve1opper 03.05.2019 03:24

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

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

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

Ну, там только один массив. Который я добавляю новые строки значений. Таким образом, arr1[0]-arr2[0] не работает. Теперь arr[0] индексирует последнюю строку, но тогда мне также нужно иметь возможность индексировать предпоследнюю строку. Arr - это массив, который постоянно обновляется (добавляется) новыми значениями, и все, что я хочу знать, это как индексировать предпоследнюю строку добавленных значений.

Deve1opper 28.04.2019 21:35

Я обновил ответ. Надеюсь, это решит вашу проблему. Если нет, дайте мне знать. Кроме того, пожалуйста, приведите хороший простой пример. Ваш текущий пример настолько запутан...

kmario23 28.04.2019 22:08

Я предоставил упрощенную версию, то есть настолько, насколько я мог ее упростить. Кроме того, arr[0]-array[2] выдает IndexError: индекс 2 выходит за границы для оси 0 с размером 2. Аналогично для arr[-4]-arr[-2] IndexError: index-4 выходит за границы для оси 0 с размером 2. Что касается [0]-[-2], он извлекает [0. 0.]. Я обнаружил, что первый [] индексирует элемент wm[0] или hm[1], а второй [] индексирует один из двух столбцов значений внутри каждого элемента. Поэтому я либо получаю другое значение индексации ([0][1][-2]), которое выдает ошибку.

Deve1opper 03.05.2019 03:42

Или я удаляю hm, который с моим недавним открытием на самом деле является столбцом (я добавил визуальное представление), поэтому он не идеален, но даже с массивом, имеющим только столбец wm, [0][-2] извлекает IndexError: list index вне диапазона. Итак, теперь я исчерпал все варианты, о которых только мог подумать, поэтому я спрашиваю сообщество. Мне сложно все это объяснять, но надеюсь, вы поняли!

Deve1opper 03.05.2019 03:44

Другие вопросы по теме