2016-10-24 4 views
0

정규화 된 배열에서 X 및 Y 값에 액세스하고 있습니다. 하지만 for 루프를 사용하여 정규화 된 배열의 모든 빈에 방정식을 적용하는 동안 0으로 값을 제외하고 싶습니다. 0 값으로 오류가 발생합니다. true_divide에서 발생하는 0으로 RuntimeWarning을 나누기 : RuntimeWarning을 : 나는)합니다 ((SECURITY) 기능을 비활성화를 인쇄 할 때정규화 된 배열에 액세스하고 for 루프에서 0 값 제외

 normed = array([[ 0.0003, 0.0026, 0.0149, 0.0288, 0.0328, 0.0174, 0.0036, 
    0.0004, 0. , 0. ], 
    [ 0.0001, 0.0024, 0.0103, 0.0244, 0.0321, 0.0211, 0.0064, 
    0.0006, 0. , 0. ], 
    [ 0.0003, 0.0012, 0.0072, 0.0235, 0.0325, 0.0246, 0.0079, 
    0.0012, 0. , 0. ], 
    [ 0. , 0.0008, 0.0065, 0.0182, 0.0346, 0.0274, 0.0124, 
    0.002 , 0.0004, 0. ], 
    [ 0. , 0.0005, 0.0033, 0.0155, 0.0302, 0.0327, 0.0153, 
    0.0032, 0.0003, 0. ], 
    [ 0. , 0.0002, 0.0025, 0.0121, 0.0283, 0.0342, 0.0184, 
    0.0054, 0.0004, 0. ], 
    [ 0. , 0.0001, 0.0016, 0.008 , 0.0253, 0.0318, 0.0219, 
    0.0084, 0.001 , 0.0002], 
    [ 0. , 0. , 0.0008, 0.0056, 0.0198, 0.0316, 0.0296, 
    0.0108, 0.0018, 0.0002], 
    [ 0. , 0.0001, 0.0007, 0.0035, 0.0169, 0.0329, 0.0318, 
    0.0163, 0.0039, 0.0006], 
    [ 0. , 0. , 0.0001, 0.0022, 0.0107, 0.0253, 0.0329, 
    0.0171, 0.004 , 0.0011]]) 

    Px = normed.sum(axis=0) 
    array([ 0.0007, 0.0079, 0.0479, 0.1418, 0.2632, 0.279 , 0.1802, 
    0.0654, 0.0118, 0.0021]) 

    def funct(): 
    CEnt = 0 
     for i in range(0,10): 
      if i > 0: 
       for j in range(0,10): 
        if j > 0: 
        CEnt += normed[i][j]*np.log2(Px/(normed[i][j])) 
     return CEnt 

, 나는 오류가있는 [유모 유모 유모 유모 유모 유모 유모 유모 유모 유모]를 얻을 곱셈

에서 발생하는 잘못된 값

0 값을 제외하는 동안 CEnt 방정식을 사용하여 배열의 100 개의 저장소를 루프하는 for 루프를 작성하려면 어떻게해야합니까? 대단히 감사합니다 ....

답변

0

인덱스를 실제 값 대신 0으로 비교합니다. 다음 코드는 0을 무시합니다.

import numpy as np 
from numpy import array 

normed = array([[ 0.0003, 0.0026, 0.0149, 0.0288, 0.0328, 0.0174, 0.0036, 
    0.0004, 0. , 0. ], 
    [ 0.0001, 0.0024, 0.0103, 0.0244, 0.0321, 0.0211, 0.0064, 
    0.0006, 0. , 0. ], 
    [ 0.0003, 0.0012, 0.0072, 0.0235, 0.0325, 0.0246, 0.0079, 
    0.0012, 0. , 0. ], 
    [ 0. , 0.0008, 0.0065, 0.0182, 0.0346, 0.0274, 0.0124, 
    0.002 , 0.0004, 0. ], 
    [ 0. , 0.0005, 0.0033, 0.0155, 0.0302, 0.0327, 0.0153, 
    0.0032, 0.0003, 0. ], 
    [ 0. , 0.0002, 0.0025, 0.0121, 0.0283, 0.0342, 0.0184, 
    0.0054, 0.0004, 0. ], 
    [ 0. , 0.0001, 0.0016, 0.008 , 0.0253, 0.0318, 0.0219, 
    0.0084, 0.001 , 0.0002], 
    [ 0. , 0. , 0.0008, 0.0056, 0.0198, 0.0316, 0.0296, 
    0.0108, 0.0018, 0.0002], 
    [ 0. , 0.0001, 0.0007, 0.0035, 0.0169, 0.0329, 0.0318, 
    0.0163, 0.0039, 0.0006], 
    [ 0. , 0. , 0.0001, 0.0022, 0.0107, 0.0253, 0.0329, 
    0.0171, 0.004 , 0.0011]]) 

Px = normed.sum(axis=0) 

def funct(): 
    CEnt = 0 
    for line in normed: 
     for value in line: 
      if value > 0: 
       CEnt += value*np.log2(Px/(value)) 
    return CEnt 

print(funct()) 

루프는이 같은 (이것의 10 × 10 어레이)이다

def funct(): 
    CEnt = 0 
    for i in range(10): 
     for j in range(10): 
      if normed[i][j] > 0: 
       CEnt += normed[i][j]*np.log2(Px/(normed[i][j])) 
    return CEnt 
+0

그러나 'NORMED에 대한 I'I 코드 경우. 그것은 내 배열의 모든 값을 i로 만드나요? 나머지 값은 j 인 동안 0을 골라냅니다. 그래서 방정식을 0을 제외한 모든 값에 적용 할 것입니다,하지만 방정식을 표준 [i] [j] 빈에 적용하지 않습니까? 또는 모든 가치 = 규범 [i] [j]입니까? 죄송합니다, 저는 파이썬에서 초보자입니다.하지만 어떻게 든 복잡한 것에 서명을하지 않았습니다 ... – Hotaru

+0

'for i in normed'는 배열의'normed' 행을 반복합니다. 모든 반복에서 'i'는 10 개의 값으로 구성됩니다. 'for j in i'는 그 값들을 반복합니다. 따라서'j'는 코드에서'normed [i] [j]'와 같습니다. 대답을 명확하게하기 위해 변수의 이름을 변경했습니다. – surt91

관련 문제