LINUX.ORG.RU

Помогите понять синтаксис питон

 , ,


1

3

Имеем код для распознавания лица.

Что значит конструкция «rects[:, 2:] += rects[:, :2]» ? Я понимаю, что в данном контексте это «x,y,dx,dy -> x, y, x+dx, y+dy», но как это понять в понятиях питона. Буду признателен за ссылку на мануал, так как python arrays[: ... :] херово гуглится из за этих символов.

(с) код взят с этого блога

#!/usr/bin/python

import cv2

def detect(path):
    img = cv2.imread(path)
    cascade = cv2.CascadeClassifier("/usr/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml")
    rects = cascade.detectMultiScale(img, 1.3, 4, cv2.cv.CV_HAAR_SCALE_IMAGE, (20,20))

    if len(rects) == 0:
        return [], img
    print rects
    rects[:, 2:] += rects[:, :2]
    print rects
    return rects, img

def box(rects, img):
    for x1, y1, x2, y2 in rects:
        cv2.rectangle(img, (x1, y1), (x2, y2), (127, 255, 0), 2)
    cv2.imwrite('detected.jpg', img);

rects, img = detect("one.jpg")
box(rects, img)

Deleted

Последнее исправление: CYB3R (всего исправлений: 1)

Гугли по „встроенные типы данных в python“

init_6 ★★★★★
()
Ответ на: комментарий от DELIRIUM

Благодарю

Привожу пояснения:

Python slice notation Addressing subsets of a list is easy a hell in Python. Dig this:

Assuming we have a list a=[some items],

a[:] gives you the entire list. Ok, the benefit of that one maybe wasn't too obvious. Bear with me though!

a[x:y] gives you items x to y (excluding 'y')

a[x:] gives you items from x to the end of the list

a[:y] gives you items from the beginning of the list to (but again excluding) y

So far so good. Let's step it up a notch:

a[x:y:z] gives you items x to y, hitting only every z item (this is called 'stride')

a[x::z] gives you items x to the end, with stride z

a[:y:z] you guessed it: this gives you items from the beginning to y, with stride z

Ok. That about covers it, right? Not quite...

a[-x] gives you x:th to last item, e.g. a[-1] gives you the last item, a[-2] the second to last and so on.

a[-x:-y] gives you x:th to last to y:th to last items, so e.g. a[-5:-2] gives you the fifth item to the end to the second item to the end.

Now you probably go: what about a[-2:-5]? That just returns []! That's because not providing a stride means you're implicitly using a stride of +1, which in this case is equal to saying «take two steps back, then walk straight forward one step at a time until you're five steps behind where you started». Now, assuming you walk *straight* forward and don't follow the curvature of the earth, that's one hopeless journey, one which Python fortunately saves you from by just returning [].

Instead try this:

a[-x:-y:-z]

which much as you'd expect returns the elements a[-x] to a[-y] in reverse order with stride z.

This obviously also means that a[::-1] gives you the entire list, reversed.

Much like a[::2] gives you every other item in the list, and a[::-2] gives you every other item in the list, in reverse order.

I may be preaching to the choir here but the ability to leverage Matlab-like short-hand like this inside a modern, object oriented, modular language is one of the things that make Python such an invaluable tool during prototyping and rapid application development, especially in a such a crazy environment as a Hollywood movie production.

Finally, if you agree that the above seems pretty friggin convenient, consider this: 3**9

(с)

Deleted
()

WTF? Какая версия питона предназначена для запуска этого? На первый взгляд, эта конструкция не является синтаксисом среза, а является ошибкой. Что выдает «print rects»?

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Python 2.7.5

print rects

[[1591  811  550  550]
 [ 460  799  606  606]]

rects[:, 2:] += rects[:, :2]

print rects

[[1591  811 2141 1361]
 [ 460  799 1066 1405]]

Остался открытым вопрос, что значит запятая между двоеточиями.

Deleted
()
Ответ на: комментарий от ggrn

что значит запятая между двоеточиями.

По идее кортэж.

ggrn ★★★★★
()
Ответ на: комментарий от Deleted

Напиши небольшой класс и посмотри, во что раскрывается сахарок.

class A:
    def __init__(self, x):
        self.x = x
    def __getslice__(self, a, b):
        print "%s[%s:%s]" % (self.x, str(a),str(b))
    def __getitem__(self, i):
        print "%s[%s]" % (self.x, str(i))
a=A("a")

a[1,2] # a[(1,2)]
a[1:2:3] # a[slice(1, 2, 3)]
a[1:2:3, 4:5:6] # a[(slice(1, 2, 3), slice(4, 5, 6))]

a[:, 2:] # a[(slice(None, None, None), slice(2, None, None))]
a[:, :2] # a[(slice(None, None, None), slice(None, 2, None))]

Т.е. [:, 2:], грубо говоря, значит [:] по первой компоненте и [2:] по второй.

NeXTSTEP ★★
()

многомерный массив из импортированного пакета

bismi
()

по вопросу ответить не могу, но никогда не хардкодьте пути!

i_gnatenko_brain ★★★★
()
Ответ на: комментарий от NeXTSTEP

Некрофилия что ли? Нет, это личное дело каждого. Помимо того, что «старые» классы устарели, их поведение отличается в мелочах от «новых» классов. В чем именно не скажу, ибо не помню. Но на это вполне можно напороться.

Virtuos86 ★★★★★
()
Ответ на: комментарий от true_admin

А нового оператора print в py3k нет ;-)

И разве в третьем для этого не нужно пустые скобки указывать

class A():
    ...
?

Virtuos86 ★★★★★
()

«Питон — это месиво из овсянки и обрезков ногтей»

 — Гвидо ван Россум

anonymous
()
Ответ на: комментарий от Virtuos86

Что убрали, я в курсе.

Тогда какого поведения от питона ты ожидал если не поставить скобки после названия класса??

true_admin ★★★★★
()
Ответ на: комментарий от tailgunner

Это сказал Ларри Уолл о Лиспе.

А, ну да, в Питоне же еще коряги, камни и куски арматуры.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.