v эквивалентно:
all(sum(row) == 1 for row in M.T) and sum(float(elt) for elt in p) == 1
sum(row)==1 for row in M.T
возвращает список длины вашего числа столбцов, с элементом True в позиции i, если сумма i-го столбца равна единице.
all - это встроенная функция python, которая проверяет, все ли элементы списка истинны. Если это так, он возвращает True. Здесь он возвращает True тогда и только тогда, когда все ваши столбцы имеют сумму 1.
Кроме того, вы проверяете if v == True:
. Вы можете просто написать if v:
, это проще;)
def matrix_sto(p,M):
if all(sum(row) == 1 for row in M.T) and sum(float(elt) for elt in p) == 1:
np.dot(M,p)
else:
raise ValueError('no stochastic matrix')
если вы хотите более простое решение, вы могли бы написать:
import numpy as np
def matrix_sto(p,M):
bool = True
for row in M.T:
bool = bool and sum(row) == 1
sum_vector=0
for elt in p:
sum_vector += float(elt)
bool = bool and sum_vector == 1
if bool:
np.dot(M,p)
else:
raise ValueError('no stochastic matrix')
Более того, я думаю, вам нужно поместите где-нибудь возврат;)
Если вы хотите получить результат np.dot(M,p)
, измените его на return np.dot(M,p)