根据另一个numpy数组值计算numpy数组

时间:2019-06-30 22:37:10

标签: python numpy numpy-ndarray numpy-broadcasting numpy-slicing

我需要计算具有数组D的数组Z(仅使用索引,切片和广播,没有循环):

D = [0, 0, 0, 0, 12, 36, 24, 24, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 36]

Z = [nan, nan, nan, nan, 12., 14.4, 15.36, 16.224, 16.224, 16.224, 16.224, 16.224, 16.224, 16.224, 16.224, 15.8016, 15.8016, 15.8016, 15.8016, 17.8214]

规则1:D的第一个非零值(此处为索引<4)=>数组Z值等于nan(此处为0至3)

规则2:D的第一个非零值(此处为索引4,值为12)=>数组Z在该索引(12)处获得A的值

规则3:遵循规则2,如果在索引i处D不等于0,则Z [i] = Z [i-1] + 0.1 *(D [i]-Z [i-1] )

即:

ind=4: D[4]=12 => Z[4]=12 (Rule#2)

ind=5: D[5]=36 => Z[5]=12 + 0.1 * (36 - 12) = 14.4

ind=6: D[6]=24 => Z[6]=14.4 + 0.1 * (24 - 14.4) = 15.36

ind=7: D[7]=24 => Z[7]=15.36 + 0.1 * (24 - 15.36) = 16.224

第4条规则:如果D等于0(此处为i = 8)=> Z [i] = Z [i-1]

即:

ind=8: D[8]=0 =>  D[8]=D[7]=16.224

1 个答案:

答案 0 :(得分:1)

我希望它可以帮助您

def function_needed(D,alpha):
    #Rule 1
    Z=np.zeros(len(D))
    idx=(np.array(D)!=0).argmax(axis=0)
    Z[:idx] = np.NaN
    #Rule 2
    Z[idx]=D[idx]
    #Rule 3
    x=np.array(D)[np.nonzero(np.array(D))]
    n = len(x)
    y_1 = Z[idx]
    pot = (1-alpha)**np.arange(n-1, -1, -1)
    y = alpha*np.cumsum(pot * x)/pot+y_1*(1-alpha)**np.arange(1, n+1)
    Z[np.nonzero(D)]=y
    #Rule 4
    mask =(Z==0)
    idx = np.where(~mask,np.arange(mask.shape[0]),0)
    Z=Z[np.maximum.accumulate(idx,axis=0, out=idx)]
    return Z

testing=function_needed(D,0.1)

我开发了一个名为function_needed的函数,可以一次制定所有规则。这是一步一步的解释

规则1

1-创建一个大小为0的数组,其大小与原始数组D相同

Z=np.zeros(len(D))

2-获取第一个非零值的索引

idx=(np.array(D)!=0).argmax(axis=0)

3-将NaN设置为第一个非零值之前的所有值

Z[:idx] = np.NaN

规则2

1-在D的第一个非零值的索引处用第一个非零需求填充Z

Z[idx]=D[idx]

规则3

仅当需求非零时才有Z的新计算

1-创建X对应于D非零的数组

x=np.array(D)[np.nonzero(np.array(D))]

2-如果我们考虑Y,则按非规则需求3中的规则3中的建议进行计算。我们注意到,递归地将Y的每个元素赋予以下公式

image of the formula

其中y_1是第一个非零值

n = len(x)

y_1 = Z[idx]

pot = (1-alpha)**np.arange(n-1, -1, -1)

y = alpha*np.cumsum(pot * x)/pot+y_1*(1-alpha)**np.arange(1, n+1)

Z[np.nonzero(D)]=y

在那个阶段Z等于

Z

规则4

将在上一步中获得的0值替换为第一个劣等非零值。这就是我们所谓的预先填充:

mask =(Z==0)
idx = np.where(~mask,np.arange(mask.shape[0]),0)
Z=Z[np.maximum.accumulate(idx,axis=0, out=idx)]