2015-08-04 10 views
6

GÜNCELLEME (gerçek hatası)

uyarı. İşte bütünüyle benim işlevi (... hatlarının bazı belirsiz ve kafa karıştırıcı ise üzgün) 'dirnumpy "Boş dilim ortalaması." Hata nereden geldiğini ben misidentified

Sorunu araştırdık ve (değil bu yazı) aşağıda nakledilir cevabını, bulduk
def removeLines(input,CRVAL1,CDELT1): #Masks out the Balmer lines from the spectrum 
    #Numbers 4060, 4150, 4300, 4375, 4800, and 4950 obtained from fit_RVs.pro. 
    #Other numbers obtained from the Balmer absorption series lines 

    for i in range(0,len(lineWindows),2): 
     left = toIndex(lineWindows[i],CRVAL1,CDELT1) 
     right = toIndex(lineWindows[i+1],CRVAL1,CDELT1) 

     print "left = ", left 
     print "right = ", right 
     print "20 from right =\n", input[right:right+20] 
     print "mean of 20 = ", numpy.mean(input[right:right+20]) 

     #Find the averages on the left and right sides 
     left_avg = numpy.mean(input[left-20:left]) 
     right_avg = numpy.mean(input[right:right+20]) #<--- NOT here 

     print "right_avg = ", right_avg 

     #Find the slope between the averages 
     slope = (left_avg - right_avg)/(left - right) 

     #Find the y-intercept of the line conjoining the averages 
     bval = ((left_avg - slope*left) + (right_avg - slope*right))/2 

     for j in range(left,right):  #Redefine the data to follow the line conjoining 
      input[j] = slope*j + bval #the sides of the peaks 

    left = int(input[0]) 
    left_avg = int(input[0]) 
    right = toIndex(lineWindows[0],CRVAL1,CDELT1) 
    right_avg = numpy.mean(input[right:right+20]) #<---- THIS IS WHERE IT IS! 
    slope = (left_avg - right_avg)/(left - right) 
    bval = ((left_avg - slope*left) + (right_avg - slope*right))/2 

    for i in range(left, right): 
     input[i] = slope*i + bval 
    return input 

.


hatası (saçma sahte hata)

#left = An index in the data (on the 'left' side) 
#right = An index in the data (on the 'right' side) 
#input = The data array 

print "left = ", left 
print "right = ", right 
print "20 from right =\n", input[right:right+20] 
print "mean of 20 = ", numpy.mean(input[right:right+20]) 

#Find the averages on the left and right sides 
left_avg = numpy.mean(input[left-20:left]) 
right_avg = numpy.mean(input[right:right+20]) 

zaman

left = 1333 
right = 1490 
20 from right = 
[ 0.14138737 0.14085886 0.14038289 0.14045525 0.14078836 0.14083192 
    0.14072289 0.14082283 0.14058594 0.13977806 0.13955595 0.13998236 
    0.1400764 0.1399636 0.14025062 0.14074247 0.14094831 0.14078569 
    0.14001536 0.13895717] 
mean of 20 = 0.140395 
Traceback (most recent call last): 
... 
    File "getRVs.py", line 201, in removeLines 
    right_avg = numpy.mean(input[right:right+20]) 
    File "C:\Users\MyName\Anaconda\lib\site-packages\numpy\core\fromnumeric.py", line 2735, in mean 
    out=out, keepdims=keepdims) 
    File "C:\Users\MyName\Anaconda\lib\site-packages\numpy\core\_methods.py", line 59, in _mean 
    warnings.warn("Mean of empty slice.", RuntimeWarning) 
RuntimeWarning: Mean of empty slice. 

O farklı doğru numpy.mean çalışır bunu yazdırırken görünür, fakat ediyorum çıktı üretti onu bir değere ata. Herhangi bir geri bildirim çok takdir edilecektir. Sorumu okumak için zaman ayırdığınız için teşekkür ederim.


Kısacası

Kısa açıklama, ben bilimsel veri ve kod parçasını işlemek için bir kod yazıyorum yaklaşık 20 değerin ortalamasını alarak içerir.

#left = An index in the data (on the 'left' side) 
#right = An index in the data (on the 'right' side) 
#input = The data array 

#Find the averages on the left and right sides 
left_avg = numpy.mean(input[left-20:left]) 
right_avg = numpy.mean(input[right:right+20]) 

Bu kod, "Boş dilim ortalaması" olan bir sayı döndürür. uyarı ve annoyingly değerli çıkışımda yazdırır! Ben denemek ve örneğin here görüldüğü gibi uyarı kaynağını izini karar, bu yüzden aşağıdaki snipped Traceback döndü kodumu, üstündeki

import warnings 
warnings.simplefilter("error") 

yerleştirilen:

File "getRVs.py", line 201, in removeLines 
    right_avg = numpy.mean(input[right:right+20]) 
    File "C:\Users\MyName\Anaconda\lib\site-packages\numpy\core\fromnumeric.py", line 2735, in mean 
    out=out, keepdims=keepdims) 
    File "C:\Users\MyName\Anaconda\lib\site-packages\numpy\core\_methods.py", line 59, in _mean 
    warnings.warn("Mean of empty slice.", RuntimeWarning) 
RuntimeWarning: Mean of empty slice. 

Traceback'in yaklaşık 2/3'ünü atladım çünkü veri okunabilirliğini veya boyutunu etkilemeyen yaklaşık 5 zor-açıklamalı işlevden geçiyor.

Yani right_avg gerçekten boş dilimin bir numpy.mean uğraş olmadığını görmek için tüm operasyonu yazdırmak için karar ... Ve şeyler gerçekten garip var bu.

+1

Hata, "numpy.mean (giriş [sağa: sağ + 20]) ikinci çağrıldığında," girdi [sağa: sağ + 20]] boş olduğunu söylüyor. "Input" değerini değiştiren birinci ve ikinci aramalar arasında bir kod bulunmalıdır. – unutbu

+0

'input' ** değerleri ** dediğiniz gibi değiştiriliyor, ancak aynı kodu daha önce çağırılmadan önce yazdığımda hata yok. "Left_avg" öğesini nasıl atadığımla ilgili bir sorun olduğunu düşünüyor musunuz? – boof

+0

Haklıymışsın! Kodun bir kısmı daha sonra "right_avg" işlevini taşıyan aynı işlevde bulunur. İnsanların zamanını boşa harcamamak için ana parçayı güncelledim. Utanç verici ... – boof

cevap

3

Siz dingbat! Cevap belli, değil mi? Hata kodunuzun hangi satırda kaldığını açıkça belirlediniz. Yapmanız gereken şey, veride göz önünde bulundurulacak olan orta noktanın çevresindeki pencerenin (left ve right taraflarının) veri dizisinin kenarına çok yakın olan olduğu özel durum için kod yazmaktır.

def removeLines(input,CRVAL1,CDELT1): #Masks out the Balmer lines from the spectrum for i in range(0,len(lineWindows),2): left = toIndex(lineWindows[i],CRVAL1,CDELT1) right = toIndex(lineWindows[i+1],CRVAL1,CDELT1) #Find the averages on the left and right sides left_avg = numpy.mean(input[left-20:left]) right_avg = numpy.mean(input[right:right+20]) #Find the slope between the averages slope = (left_avg - right_avg)/(left - right) #Find the y-intercept of the line conjoining the averages bval = ((left_avg - slope*left) + (right_avg - slope*right))/2 for j in range(left,right): #Redefine the data to follow the line conjoining input[j] = slope*j + bval #the sides of the peaks left = 0 left_avg = int(input[0]) if toIndex(lineWindows[0],CRVAL1,CDELT1) < 0: right = 0 else: right = toIndex(lineWindows[0],CRVAL1,CDELT1) right_avg = numpy.mean(input[right:right+20]) slope = (left_avg - right_avg)/(left - right) bval = ((left_avg - slope*left) + (right_avg - slope*right))/2 for i in range(left, right): input[i] = slope*i + bval return input 

Basitçe bu

right = toIndex(lineWindows[0],CRVAL1,CDELT1) #Error occurs where right = -10 
right_avg = numpy.mean(input[right:right+20]) #Index of -10? Yeah, right. 

bu

if toIndex(lineWindows[0],CRVAL1,CDELT1) < 0: right = 0 #Index 0, much better! 
else: right = toIndex(lineWindows[0],CRVAL1,CDELT1) #Leave it alone if it isn't a problem. 

right_avg = numpy.mean(input[right:right+20]) 

için Ayrıca, left = int(input[0]) hakkında tamamen yanlış değiştirmek, bu yüzden sizin için left = 0 değiştirdi. Kim bilir Bu özensiz, özensiz kod ne gibi basit hatalar veriyor? Yığın Taşması'na göndermeden önce biraz daha sert görün, lütfen!

1

Hatanızı yeniden oluşturamadım. En son numpy sürümünü mi kullanıyorsunuz? Ancak, anahtar kelimeyi göz ardı ederek uyarıları bastırabilirsiniz (bkz. https://docs.python.org/2/library/warnings.html#temporarily-suppressing-warnings)

Bu hata normalde boş bir listenin işleve aktarıldığı anlamına gelir.

>>> a = [] 

>>> import numpy 
>>> numpy.mean(a) 
/shahlab/pipelines/apps_centos6/Python-2.7.10/lib/python2.7/site-packages/numpy/core/_methods.py:59: RuntimeWarning: Mean of empty slice. 
    warnings.warn("Mean of empty slice.", RuntimeWarning) 
/shahlab/pipelines/apps_centos6/Python-2.7.10/lib/python2.7/site-packages/numpy/core/_methods.py:71: RuntimeWarning: invalid value encountered in double_scalars 
    ret = ret.dtype.type(ret/rcount) 
nan 
>>> print numpy.mean(a) 
nan 

>>> import warnings 
>>> warnings.simplefilter("ignore") 
>>> numpy.mean(a) 
nan 

>>> a=[ 0.14138737, 0.14085886, 0.14038289, 0.14045525, 0.14078836, 0.14083192, 0.14072289, 0.14082283, 0.14058594, 0.13977806, 0.13955595, 0.13998236, 0.1400764, 0.1399636, 0.14025062, 0.14074247, 0.14094831, 0.14078569, 0.14001536, 0.13895717] 
>>> numpy.mean(a) 
0.140394615 
>>> x = numpy.mean(a) 
>>> print x 
0.140394615 
>>> numpy.__version__ 
'1.9.2' 

Bu yardımcı olur umarım.

+0

Teşekkür ederiz Cevap! İlk başta uyarıları bastırmayı denedim ama sonra kafamda küçük bir kırmızı bayrak çıktı. Burada _scientific_ data ile uğraşıyorum, bu da benim kodumun bilinmeyen bir nedenden ötürü boş bir listeyi işliyor olmasının çok önemli olduğunu gösteriyor. Bunu kontrol etmek için gittiğimde, liste ** boş değil gibi olduğunu söylediler ** boş olduğunu söyledi! Bu yüzden şimdi numpy'nin bunu neden yaptığını anlamaya çalışıyorum. Ayrıca, sürüm 1.9.2'yi kullanıyorum. – boof

+0

Bu garip. Kod, "giriş" listesini değiştirmez. Bu hatayı yeniden üretebilen kodu (belki daha küçük bir girdi listesiyle) postalamak mümkün mü? Aynı hatayı alıp alamayacağımı görmek için bazı kukla verilerle çalışacağım. – Diljot

+0

Sadece ana gönderiyi güncelledim. Tamamen hata yaptım ve yanlış kod satırı hata olarak belirledim. Şu anda baktığım şey, uyarının neden olduğu konusunda daha mantıklı. Afedersiniz! – boof

İlgili konular