Numpy оператор вместо двойного цикла for - PullRequest
0 голосов
/ 09 декабря 2018

Мой следующий код на Python очень медленный, есть ли возможность полностью написать эту часть с помощью оператора Numpy?

    m = len(self.man_list)
    s = len(self.newnew)

self.zeroMatrix = np.zeros((m,s))

    for k in range(m):
        a1 = self.man_list[k][2]
        b1 = self.man_list[k][0]
        a2 = self.man_list[k][3]
        b2 = self.man_list[k][1]
        for f, part in enumerate(self.extra_list):
            x1 = self.extra_list[f][0]
            y1 = self.extra_list[f][2]
            x2 = self.extra_list[f][1]
            y2 = self.extra_list[f][3]

            first = np.array((x1, y1))
            second = np.array((x2, y2))
            third = np.array((a1, b1))
            forth = np.array((a2, b2))


            dist1 = np.linalg.norm(first - third)
            dist2 = np.linalg.norm(second - forth)
            distance = (dist1 + dist2)

            self.zeroMatrix[k][f] = distance

Прежде всего, я создаю матрицу с нулями (self.zeroMatrix).

self.man_list и self.extra_list содержат начальную и конечную точки координат линий.Например:

self.man_list = [ [ [1,2], [3,4] ],...]

self.extra_list = [ [ [11,30], [4, 10] ],...]

Я получаю расстояние от каждой строки первого списка до каждой строки другого списка, затем я регистрирую это значение расстояния в self.zeroMatrix.

IЯ очень благодарен за ваши ответы!

1 Ответ

0 голосов
/ 09 декабря 2018

Вам необходимо векторизовать ваши вызовы:

man_list = np.array(self.man_list)
extra_list = np.array(self.extra_list)

Затем создайте необходимые подматрицы:

first = extra_list[:, None, ::2]
second = extra_list[:, None, 1::2]
third = man_list[None, :, 2::-2]
fourth = man_list[None, :, 3::-2]

А теперь вычислите норму по последней оси, оси 2.

dist1 = np.linalg.norm(first - third, axis=2)
dist2 = np.linalg.norm(second - fourth, axis=2)
distance = (dist1 + dist2)

И теперь вы должны иметь в distance матрицу, которую вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...