python 掩码数组的 IndexError
python IndexError for masked array
我将数据格式化为 3 维数组,我正在对其中一个轴上的每个元素执行回归。以下代码按我的预期工作,returns 是回归斜率的列表。
import numpy as np
from scipy import stats
import numpy.ma as ma
#make array
np.random.seed(0)
array = np.random.random((4,3,2))
def regress_slope(array):
N=array.shape[0]
alpha=0.9
y = array[:,:,1]
x = array[:,:,0]
result = [stats.mstats.theilslopes(y[i,...],x[i,...],alpha)[0] for i in range(0,N)]
return result
result = regress_slope(array)
list(result)
print(result)
我的 "real" 数据包含无效值,我定义了一个阈值 (<0.1) 并试图从数组中屏蔽这些值。但是,当我使用屏蔽数组时,它会抛出此错误:
array2 = ma.masked_less_equal(array, 0.1)
result2 = regress_slope(array2)
list(result2)
IndexError: index 0 is out of bounds for axis 0 with size 0
我不确定这条错误消息是什么意思,但我认为这可能是因为没有足够的未屏蔽值来计算回归?如果是这种情况,我如何将结果中的代码调整为 return nan?
你是正确的,如果没有足够的未屏蔽值来计算回归,函数 stats.mstats.theilslopes
会失败并显示该错误消息。
一个最小的例子:
# this works
a = ma.masked_array([1, 2], mask=[0, 0])
b = ma.masked_array([1, 2], mask=[0, 0])
stats.mstats.theilslopes(a, b, 0.95)
# but this does not
b = ma.masked_array([1, 2], mask=[0, 1])
stats.mstats.theilslopes(a, b, 0.95)
错误消息表明,在计算过程中的某处,它试图访问没有元素的结果的第一个轴上的第一个元素。
我对你尝试做的事情的理论了解不够,无法知道结果是否有用,但这将解决你眼前的问题:
import numpy as np
from scipy import stats
import numpy.ma as ma
np.random.seed(0)
a = np.random.random((4, 3, 2))
def regress_slope(arr):
def safe_first_theilslopes(arr1, arr2, a):
try:
return stats.mstats.theilslopes(arr1, arr2, a)[0]
except IndexError:
return np.NaN
n = arr.shape[0]
alpha = 0.9
y = arr[:, :, 1]
x = arr[:, :, 0]
return [safe_first_theilslopes(y[i, ...], x[i, ...], alpha) for i in range(0, n)]
result = regress_slope(a)
print(result)
a2 = ma.masked_less_equal(a, 0.1)
result2 = regress_slope(a2)
print(result2)
请注意我如何使用函数 return 函数结果的第一个元素 (stats.mstats.theilslopes(arr1, arr2, a)[0]
) 或 np.NaN
,因此现在将其融入该函数。
此代码有效,但会抛出一些警告,您可以抑制但应该首先查看:
RuntimeWarning: Mean of empty slice.
out=out, **kwargs)
\lib\site-packages\numpy\core\_methods.py:161: RuntimeWarning: invalid value encountered in double_scalars
ret = ret.dtype.type(ret / rcount)
我将数据格式化为 3 维数组,我正在对其中一个轴上的每个元素执行回归。以下代码按我的预期工作,returns 是回归斜率的列表。
import numpy as np
from scipy import stats
import numpy.ma as ma
#make array
np.random.seed(0)
array = np.random.random((4,3,2))
def regress_slope(array):
N=array.shape[0]
alpha=0.9
y = array[:,:,1]
x = array[:,:,0]
result = [stats.mstats.theilslopes(y[i,...],x[i,...],alpha)[0] for i in range(0,N)]
return result
result = regress_slope(array)
list(result)
print(result)
我的 "real" 数据包含无效值,我定义了一个阈值 (<0.1) 并试图从数组中屏蔽这些值。但是,当我使用屏蔽数组时,它会抛出此错误:
array2 = ma.masked_less_equal(array, 0.1)
result2 = regress_slope(array2)
list(result2)
IndexError: index 0 is out of bounds for axis 0 with size 0
我不确定这条错误消息是什么意思,但我认为这可能是因为没有足够的未屏蔽值来计算回归?如果是这种情况,我如何将结果中的代码调整为 return nan?
你是正确的,如果没有足够的未屏蔽值来计算回归,函数 stats.mstats.theilslopes
会失败并显示该错误消息。
一个最小的例子:
# this works
a = ma.masked_array([1, 2], mask=[0, 0])
b = ma.masked_array([1, 2], mask=[0, 0])
stats.mstats.theilslopes(a, b, 0.95)
# but this does not
b = ma.masked_array([1, 2], mask=[0, 1])
stats.mstats.theilslopes(a, b, 0.95)
错误消息表明,在计算过程中的某处,它试图访问没有元素的结果的第一个轴上的第一个元素。
我对你尝试做的事情的理论了解不够,无法知道结果是否有用,但这将解决你眼前的问题:
import numpy as np
from scipy import stats
import numpy.ma as ma
np.random.seed(0)
a = np.random.random((4, 3, 2))
def regress_slope(arr):
def safe_first_theilslopes(arr1, arr2, a):
try:
return stats.mstats.theilslopes(arr1, arr2, a)[0]
except IndexError:
return np.NaN
n = arr.shape[0]
alpha = 0.9
y = arr[:, :, 1]
x = arr[:, :, 0]
return [safe_first_theilslopes(y[i, ...], x[i, ...], alpha) for i in range(0, n)]
result = regress_slope(a)
print(result)
a2 = ma.masked_less_equal(a, 0.1)
result2 = regress_slope(a2)
print(result2)
请注意我如何使用函数 return 函数结果的第一个元素 (stats.mstats.theilslopes(arr1, arr2, a)[0]
) 或 np.NaN
,因此现在将其融入该函数。
此代码有效,但会抛出一些警告,您可以抑制但应该首先查看:
RuntimeWarning: Mean of empty slice.
out=out, **kwargs)
\lib\site-packages\numpy\core\_methods.py:161: RuntimeWarning: invalid value encountered in double_scalars
ret = ret.dtype.type(ret / rcount)