Использование np.arange для создания списка пар координат - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь сделать программу быстрее, и я нашел сообщение , и я хочу реализовать решение, напоминающее четвертый случай, приведенный в этом вопросе.

Вот соответствующая часть кода, который я использую:

count = 0
hist_dat = np.zeros(r**2)
points = np.zeros((r**2, 2))
for a in range(r):
    for b in range(r):
        for i in range(N):
            for j in range(N):
                hist_dat[count] += retval(a/r, (a+1)/r, data_a[i][j])*retval(b/r, (b+1)/r, data_b[i][j])/N
                points[count][0], points[count][1] = (a+0.5)/r, (b+0.5)/r
        count += 1

Этот код генерирует значения нормализованной двумерной гистограммы (с делениями "r" в каждом направлении) и координаты для этих значений как numpy.ndarray. Как вы можете видеть в другом связанном вопросе, в настоящее время я использую второе худшее из возможных решений, и для его запуска требуется несколько минут.

Для начала я хочу изменить то, что код делает для массива points (я думаю, что, как только я увижу, как это делается, я смог бы кое-что выяснить для hist_dat). Что в основном так: creation of the

В конкретном случае, над которым я работаю, A и B одинаковы. Так, например, это может быть как переход от array([0, 0.5, 1]) к array([[0,0], [0,0.5], [0,1], [0.5,0], [0.5,0.5], [0.5,1], [1,0], [1,0.5], [1,1]])

Существует ли какой-либо метод для numpy.ndarray или операция с np.arange(), которая выполняет то, что показано на приведенной выше диаграмме, не требуя for циклов?

Или есть какая-нибудь альтернатива, которая может сделать это так же быстро, как показано в связанном посте для np.arange()?

Ответы [ 2 ]

1 голос
/ 21 июня 2019

может быть np.mgird поможет?

import numpy as np
np.mgrid[0:2:.5,0:2:.5].reshape(2,4**2).T

Вывод:

array([[0. , 0. ],
       [0. , 0.5],
       [0. , 1. ],
       [0. , 1.5],
       [0.5, 0. ],
       [0.5, 0.5],
       [0.5, 1. ],
       [0.5, 1.5],
       [1. , 0. ],
       [1. , 0.5],
       [1. , 1. ],
       [1. , 1.5],
       [1.5, 0. ],
       [1.5, 0.5],
       [1.5, 1. ],
       [1.5, 1.5]])
1 голос
/ 21 июня 2019

Вы можете использовать np.c_, чтобы объединить результат np.repeat и np.tile:

import numpy as np

start = 0.5
end = 5.5
step = 1.0

points = np.arange(start, end, step)  # [0.5, 1.5, 2.5, 3.5, 4.5]
output = np.c_[np.repeat(points, n_elements), np.tile(points, n_elements)]

print(output)

Выход:

[[0.5 0.5]
 [0.5 1.5]
 [0.5 2.5]
 [0.5 3.5]
 [0.5 4.5]
 [1.5 0.5]
 [1.5 1.5]
 [1.5 2.5]
 [1.5 3.5]
 [1.5 4.5]
 [2.5 0.5]
 [2.5 1.5]
 [2.5 2.5]
 [2.5 3.5]
 [2.5 4.5]
 [3.5 0.5]
 [3.5 1.5]
 [3.5 2.5]
 [3.5 3.5]
 [3.5 4.5]
 [4.5 0.5]
 [4.5 1.5]
 [4.5 2.5]
 [4.5 3.5]
 [4.5 4.5]]
...