エラーの原因を誤認しました。これが私の機能全体です(一部の行があいまいで混乱している場合は申し訳ありません...)
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
私は問題を調査し、答えを見つけました。それは以下に投稿されています(この投稿にはありません)。
#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])
出力を生成しました
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.
numpy.mean
は、印刷すると正しく実行されるように見えますが、値に割り当てると異なるように見えます。フィードバックをいただければ幸いです。時間を割いて私の質問を読んでいただきありがとうございます。
要するに、私は科学的データを処理するためのコードを書いています、そしてコードの一部は約20の値の平均を取ることを含みます。
#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])
このコードは、「空のスライスの平均」という数字を返します。警告し、迷惑なことに私の貴重な出力にそれを印刷します!たとえば、警告の原因を追跡することにしました ここ など、
import warnings
warnings.simplefilter("error")
コードの先頭に、次の切り取られたトレースバックが返されました。
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.
トレースバックの約2/3は、データの可読性やサイズに影響を与えない、説明が難しい約5つの関数を通過するため省略しました。
そこで、操作全体を印刷して、right_avg
が実際に空のスライスのnumpy.mean
を試行しているかどうかを確認することにしました...そして、それが本当に奇妙な。
あなたはディンバット!答えは明らかですよね?エラーが発生したコードの行を明確に誤認しました。あなたがする必要があるのは、データで考慮されている中心点の周りのウィンドウ(left
とright
の側面)が近すぎる)である特定の場合のコードを書くことですデータ配列のエッジへ。
_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
_
これを変更するだけです
_right = toIndex(lineWindows[0],CRVAL1,CDELT1) #Error occurs where right = -10
right_avg = numpy.mean(input[right:right+20]) #Index of -10? Yeah, right.
_
これに
_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])
_
また、あなたはleft = int(input[0])
について完全に間違っていたので、_left = 0
_に変更しました。 誰が知っていますかこのずさんな、ずさんなコードがもたらす他の単純なエラーは何ですか? Stack Overflowに投稿する前に、もう少しよく見てください。
エラーを再現できませんでした。最新のnumpyバージョンを使用していますか?ただし、キーワードignoreを使用して警告を抑制することはできます( https://docs.python.org/2/library/warnings.html#temporarily-suppressing-warnings を参照)
このエラーは通常、空のリストが関数に渡されたことを意味します。
>>> 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'
お役に立てば幸いです。