2013-05-07 85 views
1

我想创建一个数组或列表,其中任何时候只包含3个条目。函数应该循环,并且每个循环1条目将被添加到列表中,并将最旧的值推出,然后根据列表中的3个值计算一个值。创建一个固定大小的列表或数组?

我曾尝试:

import numpy as np 

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

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

它创建只有3个值(据我所知),但是阵列填充奇怪值numpy的数组:

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

人知道为什么/什么我”我做错了什么,或者有更好的解决方案来做我想做的事情?

回答

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项? – 2013-05-07 22:20:17

+0

@RyanSaxe因为OP的例子有四个... – askewchan 2013-05-07 22:21:15

+0

确实,这主要是因为我试图找出它会在这种情况下丢弃哪个值,但是这回答我的问题 – 2013-05-07 22:25:18

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和如果需要的话,可以在一个deque上使用extendleft

相关问题