Как я могу получить массив переменных значений в Python? - PullRequest
13 голосов
/ 23 августа 2011

Простой вопрос здесь:

Я пытаюсь получить массив, который чередует значения (1, -1, 1, -1 .....) для заданной длины. np.repeat просто дает мне (1, 1, 1, 1, -1, -1, -1, -1). Мысли

Ответы [ 7 ]

20 голосов
/ 23 августа 2011

Мне нравится решение @ Бенджамина.Альтернативный вариант:

import numpy as np
a = np.empty((15,))
a[::2] = 1
a[1::2] = -1

Это также позволяет создавать списки нечетной длины.

РЕДАКТИРОВАТЬ: Также просто отметить скорости для массива из 10000 элементов

import numpy as np
from timeit import Timer

if __name__ == '__main__':

    setupstr="""
import numpy as np
N = 10000
"""

    method1="""
a = np.empty((N,),int)
a[::2] = 1
a[1::2] = -1
"""

    method2="""
a = np.tile([1,-1],N)
"""

    method3="""
a = np.array([1,-1]*N)   
"""

    method4="""
a = np.array(list(itertools.islice(itertools.cycle((1,-1)), N)))    
"""
    nl = 1000
    t1 = Timer(method1, setupstr).timeit(nl)
    t2 = Timer(method2, setupstr).timeit(nl)
    t3 = Timer(method3, setupstr).timeit(nl)
    t4 = Timer(method4, setupstr).timeit(nl)

    print 'method1', t1
    print 'method2', t2
    print 'method3', t3
    print 'method4', t4

В результате получается:

method1 0.0130500793457
method2 0.114426136017
method3 4.30518102646
method4 2.84446692467

Если N = 100, все начинает выравниваться, но, начиная с пустых пустых массивов, все равно значительно быстрее (nl изменено на 10000)

method1 0.05735206604
method2 0.323992013931
method3 0.556654930115
method4 0.46702003479

Массивы Numpy - это специальные удивительные объекты, и их не следует рассматривать как списки Python.

9 голосов
/ 23 августа 2011

используйте resize ():

In [38]: np.resize([1,-1], 10) # 10 is the length of result array
Out[38]: array([ 1, -1,  1, -1,  1, -1,  1, -1,  1, -1])

может выдавать массив нечетной длины:

In [39]: np.resize([1,-1], 11)
Out[39]: array([ 1, -1,  1, -1,  1, -1,  1, -1,  1, -1,  1])
7 голосов
/ 23 августа 2011

Использование numpy.tile!

import numpy
a = numpy.tile([1,-1], 15)
4 голосов
/ 23 августа 2011

Если вы хотите решение с эффективным использованием памяти, попробуйте это:

def alternator(n):
    for i in xrange(n):
        if i % 2 == 0:
            yield 1
        else:
            yield -1

Затем вы можете перебирать ответы так:

for i in alternator(n):
    # do something with i
4 голосов
/ 23 августа 2011

использовать умножение:

[1,-1] * n
2 голосов
/ 23 августа 2011

Может быть, вы ищете itertools.cycle?

list_ = (1,-1,2,-2)  # ,3,-3, ...

for n, item in enumerate(itertools.cycle(list_)):
    if n==30:
        break

    print item
0 голосов
/ 23 августа 2011

Я просто выкину их там, потому что в некоторых обстоятельствах они могут быть более полезными.

Если вы просто хотите чередовать положительное и отрицательное:

[(-1)**i for i in range(n)]

или для более общего решения

nums = [1, -1, 2]
[nums[i % len(nums)] for i in range(n)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...