короткая симуляция в numpy / python - PullRequest
0 голосов
/ 07 мая 2018

Я дал массив из 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 значения без ошибки. Эти 3 значения должны использоваться для замены nan значений в строке 2nd. Затем вычислите simu функцию для строки 2nd.

Значения nan в 3-й строке должны быть заменены вычисленными 3 значениями из 1-й и 2-й строк. Затем вычислите simu функцию для row3.

Я пытался так:

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)

Ожидаемый результат - 9 значений из цикла for:

[[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)  

1 Ответ

0 голосов
/ 07 мая 2018

Вы можете использовать список, в который вы помещаете результаты, а затем использовать этот массив results, чтобы изменить массив data в соответствии с вашим правилом:

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)

Вы можете проверить это здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...