2013-05-07 2 views
1

Я хочу создать массив или список, который содержит только 3 записи в любой момент времени. Функция должна зацикливаться, и каждый элемент цикла 1 будет добавлен в список, нажимая самое старое значение, а затем будет вычисляться значение на основе трех значений в списке.Создание списка или массива с фиксированным размером?

Я попытался:

import numpy as np 

z = np.ndarray((3,),float) 

np.append(z, [12, 14.56, 12.46, 1.56]) 

который создает Numpy массив только 3 значения (AFAIK), однако массив заполняется странные значения:

z= ([ 1.56889217e-163, 1.01899555e-297, 1.03395110e-297]) 

Кто-нибудь знает, почему/что я m делать неправильно или иметь лучшее решение для того, что я хочу делать?

ответ

2

z инициализируется как пустой массив. Эти странные значения - это просто случайные числа, которые были в пустых ячейках памяти до того, как был создан z. Вы должны иметь начальное значение.

Начать с:

z = np.array([14.56, 12.46, 1.56]) 

, а затем изменить его значение, но не append (который изменяет размер массива).

Далее приведен пример функции, которая будет «катить» элементы вашего массива на один (или любое число), а затем заменить первое значение на новое значение.

def push(a, n): 
    a = np.roll(a, 1) 
    a[0] = n 
    return a 

Конечно, вместо n, вы хотите использовать функцию a. Например, если вы хотите добавить сумму исходного массива в начале:

def push_sum(a): 
    a = np.roll(a, 1) 
    a[0] = a.sum() 
    return a 

Тогда:

In [19]: z = np.array([14.56, 12.46, 1.56]) 

In [20]: push(z, 14) 
Out[20]: array([ 14. , 14.56, 12.46]) 

In [29]: push_sum(z) 
Out[29]: array([ 28.58, 14.56, 12.46]) 
+0

У вас есть выход из более чем 3 предметов? –

+0

@RyanSaxe Поскольку пример OP имел четыре ... – askewchan

+0

Действительно, это было главным образом потому, что я пытался выяснить, какое значение он упадет в этом случае, но это все равно отвечает на мой вопрос –

3

Используйте deque:

from collections import deque 
z = deque(maxlen=3) 
z.extend([1, 2, 3, 4]) 
print z 
# deque([2, 3, 4], maxlen=3) 
z.append(5) 
# deque([3, 4, 5], maxlen=3) 
print z 

Вы также можете appendleft и extendleft на deque, если вам нужно.

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