Numpy:根据之前的元素计算?

时间:2015-05-06 05:10:16

标签: python numpy

假设我有数组xy

x = numpy.array([1,2,3,4,5,6,7,8,9,10])  # actual content is the a result of another calculation step

y有一个公式,每个元素都基于前一个元素,让i表示y的索引,每个元素都是:

y[i] = y[i-1] * 2 + x[i]

计算第一个元素时,请y[i-1] = 50。换句话说,y应为:

[101, 204, 411, 826, 1657, 3320, 6647, 13302, 26613, 53236]

如何用numpy计算y

5 个答案:

答案 0 :(得分:4)

如果你需要一个递归计算,如果你的y[i]应该依赖于来自同一次运行的计算y[i-1],那么numpy中似乎没有内置解决方案,你需要使用简单的for循环计算它:

y = np.empty(x.size)
last = 50
for i in range(x.size):
    y[i] = last = last * 2 + x[i]

请参阅此问题:Is a "for" loop necessary if elements of the a numpy vector are dependant upon the previous element?

否则,您可以使用numpy在一行中实现公式:

y = np.concatenate(([50], y[:-1])) * 2 + x

说明:

y[:-1]

创建一个N-1大小的数组:y_0, y_1, ... y_N-1

np.concatenate(([50], y[:-1]))

创建一个N大小的数组,第一个元素是起始值50.所以这个表达式基本上就是你的y[i-1]

然后你可以使用numpy数组算术进行数学元素。

答案 1 :(得分:4)

让我们在你的序列中构建一些项目:

y[0] = 2*y[-1] + x[0]
y[1] = 2*y[0] + x[1] = 4*y[-1] + 2*x[0] + x[1]
y[2] = 2*y[1] + x[2] = 8*y[-1] + 4*x[0] + 2*x[1] + x[2]
...
y[n] = 2**(n+1)*y[-1] + 2**n*x[0] + 2**(n-1)*x[1] + ... + x[n]

它可能不会立即显而易见,但您可以使用numpy构建上述序列:

n = len(x)
y_1 = 50
pot = 2**np.arange(n-1, -1, -1)
y = np.cumsum(pot * x) / pot + y_1 * 2**np.arange(1, n+1)
>>> y
array([  101,   204,   411,   826,  1657,  3320,  6647, 13302, 26613, 53236])

这类解决方案的缺点是它们不是很普遍:问题的微小变化可能会导致整个方法无用。但是,只要你能用一个小代数解决问题,它几乎肯定会远远超过任何算法方法。

答案 2 :(得分:0)

这是如何用numpy做的:

getElementById

答案 3 :(得分:0)

也许最快和最简洁的方法是使用scipy.signal.lfilter,它完全实现了您描述的那种递归关系:

... 
public async Task<IEnumerable<FoodDto>> SelectFood(string rule, string query){
    return await selectInfo.FirstOrDefault(x=>x.Rule(rule)).Select(x=>x.ReturnSearchResult(query));
}
...

结果将为from scipy.signal import lfilter import numpy as np x = np.array([1,2,3,4,5,6,7,8,9,10]) b = [1., 0.] a = [1., -2.] zi = np.array([2*50]) # initial condition y, _ = lfilter(b, a, x, zi=zi) ,但您可以将其强制转换为np.float64(如果您需要的话):

np.int32

答案 4 :(得分:-1)

以下是使用Python的方法:

x = [1, 2, 3, 4, 5, 6, 7, 8 ,9, 10]
y = [50]
for i in range(len(x)):
    y.append(y[-1] * 2 + x[i])
y = y[1:]

您可能希望从最后一个元素计算它,以防止使用下一个i的新值。