Arrays numpy/python中的一个简短模拟

Arrays numpy/python中的一个简短模拟,arrays,python-3.x,python-2.7,loops,numpy,Arrays,Python 3.x,Python 2.7,Loops,Numpy,我给出了一个包含3行的数组: import numpy as np data = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9], [1, 2, 3, 4, 5, 6, np.nan, np.nan, np.nan], [4, 3, 5, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]]) print (data) 我必须对给定数组应用此函数: def s

我给出了一个包含3行的数组:

import numpy as np  

data = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9],
              [1, 2, 3, 4, 5, 6, np.nan, np.nan, np.nan],
              [4, 3, 5, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]])

print (data)
我必须对给定数组应用此函数:

def simu(d):
    if not np.isnan(np.sum(d)):
        a = d[1:4].mean()
        b = d[3:6].mean()
        c = d[6:9].mean()
        res = [[a,b,c]]        
    else:
        res = 'error'
    return res
如果
data
行没有
nan
,则
simu
函数计算三个值。如果该行中存在
nan
,则会产生
error

1st
行,没有
nan
因此,可以为第
1st
行计算3个值,并且没有错误。这三个值用于替换第二行中的
nan
值。然后计算第二行的
simu
函数

第3行中的
nan
值将替换为第1行和第2行中计算出的3个值。然后计算第3行的
simu
函数

我做了如下尝试:

for d in data:
    d = d.reshape(-1,9)
    print (d)
    this_frame = data[0]
    print (this_frame)
    this_res = simu(this_frame)
    print (this_res)
    if np.isnan(np.sum(d)):
       ans = np.place(d, np.isnan(d), this_res)
       print (ans)
预期输出是for循环的9个值:

[[3.0, 5.0, 8.0]]
[[3.0, 5.0, 5.33]]
[[3.66, 5.33, 4.44]]
编辑:一些尝试:

results = []
currentStep = data[0]
for i in range(data.shape[0]):
    pred = simu(currentStep)
    results.append(pred)
    results = [results, pred]  
print (results)  

您可以使用将结果推送到的列表,然后根据您的规则使用此
结果
数组来更改
数据
数组:

results = simu(data[0,:])[0]
for i in range(1,data.shape[0]):
    data[i,data.shape[1]-3*i:] = results
    results.extend(simu(data[i,:])[0])

res_arr = np.asarray(results).reshape(3,3)
print(res_arr)

您可以对此进行测试。

数组的结构是否总是相同的,即第一行中始终没有NaN,第二行中没有NaN,第三行中没有NaN?@Axel是的,正如您所提到的。在您的
simu
函数中,第一列中的值永远不会被使用?是的,但是
simu
函数是不可更改的,可以解决这个问题。好的,你可以看看我的答案。但是,这假设您在
数据中具有相同的结构。如果这不起作用,请告诉我,
数据
数组可能存在哪些差异,以便我们可以找到在更广泛的环境下工作的解决方案。啊,我更改了
simu
函数,使其返回
[a,b,c]
,而不是
[[a,b,c]
。我将更新我的答案。您觉得更新后的解决方案怎么样?我删除了第二个循环,并按照您的编辑建议使用了一个列表。