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 数组(afaik),但是该数组填充了奇怪的值:

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

任何人都知道为什么/我做错了什么,或者对我想做的事情有更好的解决方案吗?

4

2 回答 2

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

于 2013-05-07T23:49:58.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])
于 2013-05-07T22:12:26.667 回答