#python #arrays #numpy #indexing #rows
#python #массивы #numpy #индексирование #строки
Вопрос:
Я был озадачен этим в течение довольно долгого времени. Как проиндексировать предпоследнюю добавленную строку?
Я перепробовал практически все возможные комбинации индексации, пытаясь проиндексировать предпоследнюю добавленную строку, и все они возвращали либо последнюю строку, либо ошибку. Вот некоторые из методов, которые я пробовал (с переключением чисел внутри этих методов): [-1][0], arr[-1, 0], arr [-2,1], arr [-2,:] и т.д. Цикл, который я использую, находится ниже.
r= is an array formatted like so [[300 240 22 22]]
arr=[] #shape is (0,)
for (x, y, w, h) in r:
wm=int(x (w/2.))
hm=int(y (h/2.))
arr.append([numpy.float32(wm), numpy.float32(hm)])
return numpy.array(arr)
Это приводит к
Индексирование массива (в режиме ожидания) извлекает (я скопировал последние два блока массива):
[[293.51373 323.4329 ]
[247.77493 316.02783]]
[[292.9887 322.23425]
[247.24142 314.2921 ]]
the shape of the returned array is (2,2) and is dtype:float32
В моей программе он отображается как (тот же массив)
—элемент wm—————— элемент hm
[[293.51373 323.4329 ][247.77493 316.02783]]
Я считаю, что это предпоследняя строка
[[292.9887 322.23425][247.24142 314.2921 ]]
и я думал, что это последняя строка
Что вызвало у меня некоторую путаницу, потому что они отображаются немного по-другому (бездействующий показывает, что массив состоит из 2 строк, а другой показывает мне, что это одна прямая линия)
Вот несколько примеров методов индексации (вместе с массивом) (это две последние последовательные строки из массива):
arr [[255.44836 280.92575] # i want to index this line
[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 [[255.35194 281.08353] # along with this line
[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
В других случаях, когда я пытаюсь проиндексировать предпоследнюю строку, она показывает мне ошибку оси, которая может быть проблемой (добавление не добавляет новые строки, которые я пытаюсь индексировать, а скорее переопределяет старые значения). Я не знаю. Поэтому я попытался переключить метод добавления с помощью:concatenate, vstack, pandas. Но это не помогло.
Все, что я хочу сделать, это найти разницу между последней и предпоследней строками из второго столбца в элементе wm (в примере 280.92575-281.08353), а также то же самое с первым столбцом элемента wm (255.44836-255.35194). Все различные методы индексации не извлекали предпоследнюю строку, только последнюю строку. Пожалуйста, дайте мне знать, есть ли другой способ индексировать предпоследнюю строку другим способом или существуют другие методы индексации. Извините, если это сбивает с толку, все еще привыкаю к этому. Я могу попытаться устранить любую путаницу. Заранее спасибо!
Ответ №1:
Эти два отображения представляют собой одно и то же, массив (2,2)
формы.
[[293.51373 323.4329 ]
[247.77493 316.02783]]
[[293.51373 323.4329 ][247.77493 316.02783]]
Это скобки []
, которые отмечают структуру массива, а не разрывы строк.
Комментарии:
1. Интересно, это имеет смысл, но все обычные индексы не работают. И я до сих пор не понимаю, как индексировать предпоследнюю строку, потому что все предлагаемые методы просто индексируют последнюю строку. Как видно из моего комментария выше, даже [-2::2] индексирует последнюю строку. Это делает его еще более запутанным, потому что массив имеет размер 2×2, поэтому я должен иметь возможность индексировать предпоследнюю строку. Сначала я подумал, что либо я использую неправильный метод индексации, либо метод добавления не позволяет мне индексировать предпоследнюю строку, потому что в документации говорится, что он не добавляет новую строку.
2. Я рассмотрел другие подобные проблемы, все они были решены либо новым методом индексации, либо новым методом добавления, который я пробовал и в том, и в другом, я не могу получить предпоследнюю строку. Теперь я застрял, пробуя новые методы индексации, надеясь, что они сработают. Я открыт для новых методов индексирования или добавления, чтобы увидеть, дают ли они необходимые результаты. Заранее спасибо.
3. В массиве (2,2) 2-я строка до последней строки является первой строкой. Есть только 2 строки. Я не знаю, что вы подразумеваете под «предпоследней строкой». Похоже, у вас есть концепция этого массива, которая сильно отличается от того, что получается из вашего кода.
4. Ну, если у меня есть одна строка с элементами wm и hm, она обновляется другими добавленными значениями, поэтому первая строка, которая у меня была, теперь является предпоследней, и она продолжает обновлять и добавлять новые значения. Я хочу индексировать не последнюю добавленную строку значений, а предыдущую. предпоследняя строка
[[293.51373 323.4329 ][247.77493 316.02783]]
и[[292.9887 322.23425][247.24142 314.2921 ]]
обновленная строка — итак, последняя ` Как проиндексировать 293.51 и 323.43, имея в виду, что это отдельная строка от последней?
Ответ №2:
Я думаю, что ответ, который вы ищете,:
Arr[-2::2]
Комментарии:
1. Спасибо за предложение и вклад, но он просто индексирует последнюю строку элемента wm.
----arr [[265.75818 269.61978][308.69952 276.45447]] arr[-2::2] [[265.75818 269.61978]] arr[-1::2] [[308.69952 276.45447]] arr[-2::1] [[265.75818 269.61978][308.69952 276.45447]] ----arr [[265.77682 269.16476] [308.67093 275.89474]] arr[-2::2] [[265.77682 269.16476]]this line should index 265.75.. and 269.61.. arr[-1::2] [[308.67093 275.89474]] arr[-2::1] [[265.77682 269.16476][308.67093 275.89474]]
Тем не менее, интересный способ индексирования, которого я раньше не видел.