2011-07-11 2 views
2

Я писал программу для грубой силы, проверяя последовательность чисел, чтобы искать эйлеровые кирпичи, но метод, который я придумал, включает тройной цикл. Поскольку вложенные петли Python заведомо медленны, мне было интересно, есть ли лучший способ использовать numpy для создания массива значений, которые мне нужны.Удаление вложенных циклов в numpy

#x=max side length of brick. User Input.  
for t in range(3,x): 
    a=[];b=[];c=[]; 
    for u in range(2,t): 
     for v in range(1,u): 
       a.append(t) 
       b.append(u) 
       c.append(v) 
    a=np.array(a) 
    b=np.array(b) 
    c=np.array(c) 
    ... 

Есть ли лучший способ генерировать значения массива af, используя команды numpy?

Спасибо.

Пример: Если х = 10, при Т = 3 Я хочу получить:

a=[3] 
b=[2]  
c=[1] 

в первый раз через петлю. После этого, когда Т = 4:

a=[4, 4, 4] 
b=[2, 3, 3] 
c=[1, 1, 2] 

В третий раз (т = 5) Я хочу:

a=[5, 5, 5, 5, 5, 5] 
b=[2, 3, 3, 4, 4, 4] 
c=[1, 1, 2, 1, 2, 3] 

и так далее, вплоть до максимальных длин боковых около 5000 или около того.

EDIT: Решение

a=array(3) 
b=array(2) 
c=array(1) 
for i in range(4,x): #Removing the (3,2,1) check from code does not affect results. 
    foo=arange(1,i-1) 
    foo2=empty(len(foo)) 
    foo2.fill(i-1) 
    c=hstack((c,foo)) 
    b=hstack((b,foo2)) 
    a=empty(len(b)) 
    a.fill(i) 
    ... 

быстрее работает во много раз. Спасибо всем.

+0

Не могли бы вы опубликовать пример входных значений и желаемых результатов? Это может помочь найти правильное выражение. –

+0

Петли вложенные 3 уровня глубоко медленны, период - не только в Python. –

ответ

1

Есть несколько вещей, которые могли бы но, вероятно, только для больших значений х. Для начала используйте xrange вместо range, который сохранит создание списка, который вам никогда не понадобится. Вы также можете создать пустые массивы numpy правильной длины и заполнить их значениями, как вы идете, вместо добавления в список, а затем преобразовать его в массив numpy.

Я считаю, что этот код не будет работать (без доступа питон прямо в эту секунду):

for t in xrange(3, x): 
    size = (t - 2) * (t - 3) 
    a = np.zeros(size) 
    b = np.zeros(size) 
    c = np.zeros(size) 

    idx = 0 
    for u in xrange(2,t): 
     for v in xrange(1,u): 
      a[idx] = t 
      b[idx] = u 
      c[idx] = v 
      idx += 1 
+0

Я думал о начале массивов, но я не могу .append() в numpy. Есть ли что-то эквивалентное? –

+0

Кроме того, если есть, то я могу просто добавлять к массивам b и c каждый раз вместо того, чтобы переписывать и начинать с нуля каждый цикл. –

+0

Попробуйте http://docs.scipy.org/doc/numpy/reference/generated/numpy.hstack.html – troutinator

2

Попробуйте использовать .empty и .Нанести (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.fill.html)

+0

Это будет работать для значений a, но не для значений b и c. –

Смежные вопросы