Arrays numpy/python中的一个简短模拟
我给出了一个包含3行的数组: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
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]
。我将更新我的答案。您觉得更新后的解决方案怎么样?我删除了第二个循环,并按照您的编辑建议使用了一个列表。