我想创建一个数组或列表,在任何给定时间只包含3个条目。该函数应该循环,每个循环1条目将被添加到列表中,将最旧的值输出,然后根据列表中的3个值计算一个值。
我试过了:
import numpy as np
z = np.ndarray((3,),float)
np.append(z, [12, 14.56, 12.46, 1.56])
创建一个只有3个值(afaik)的numpy数组,但数组中填充了奇怪的值:
z= ([ 1.56889217e-163, 1.01899555e-297, 1.03395110e-297])
任何人都知道为什么/我做错了什么或者为我想做的事情找到了更好的解决方案?
答案 0 :(得分:5)
使用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
。
答案 1 :(得分: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])