Python 执行类时出现TypeError和AttributeError
我是python类的新手,对它们有基本的了解。我试图从卫星图像中提取特征,以便稍后使用机器学习进行作物类型识别。我正在使用一个名为Python 执行类时出现TypeError和AttributeError,python,Python,我是python类的新手,对它们有基本的了解。我试图从卫星图像中提取特征,以便稍后使用机器学习进行作物类型识别。我正在使用一个名为EOlearn的库,这是我用来计算功能的代码片段: class ModifiedCholorophyllAbsorptionInReflectanceIndex(EOTask): """ The task calculates the Modified Chlorophyll Absorption in Refle
EOlearn
的库,这是我用来计算功能的代码片段:
class ModifiedCholorophyllAbsorptionInReflectanceIndex(EOTask):
"""
The task calculates the Modified Chlorophyll Absorption in Reflectance Index (MCARI)
using B05, B04, and B03.
General formula: ((700nm - 670nm) - 0.2 * (700nm - 550nm)) * (700nm /670nm)
where B05=700nm , B04=670nm, B03=550nm
"""
def __init__(self, feature_name, band_a, band_b, band_c):
self.feature_name = feature_name
self.band_a_feature_name = band_a.split('/')[0]
self.band_b_feature_name = band_b.split('/')[0]
self.band_c_feature_name = band_c.split('/')[0]
self.band_a_fetaure_idx = int(band_a.split('/')[-1])
self.band_b_feature_idx = int(band_b.split('/')[-1])
self.band_c_feature_idx = int(band_c.split('/')[-1])
def execute(self, eopatch):
band_a = eopatch.data[self.band_a_feature_name][..., self.band_a_feature_idx]
band_b = eopatch.data[self.band_b_feature_name][..., self.band_b_feature_idx]
band_c = eopatch.data[self.band_c_feature_name][..., self.band_c_feature_idx]
mcari = ((band_a - band_b) - 0.2 * (band_a - band_c)) * (band_a /band_b)
eopatch.add_feature(FeatureType.DATA, self.feature_name, mcari[..., np.newaxis])
return eopatch
class CholorophyllRedEdge(EOTask):
"""
The task calculates the Chlorophyll Red Edge using B07, and B07.
General formula: ([760:800]/[690:720])^(-1) <==> index = math.pow((B07 / B05), (-1.0))
where B07=700nm , B05=670nm
"""
def __init__(self, feature_name, band_a, band_b):
self.feature_name = feature_name
self.band_a_feature_name = band_a.split('/')[0]
self.band_b_feature_name = band_b.split('/')[0]
self.band_a_feature_idx = int(band_a.split('/')[-1])
self.band_b_feature_idx = int(band_b.split('/')[-1])
def execute(self, eopatch):
band_a = eopatch.data[self.band_a_feature_name][..., self.band_a_feature_idx]
band_b = eopatch.data[self.band_b_feature_name][..., self.band_b_feature_idx]
red_edge = (band_a /band_b)**(-1)
eopatch.add_feature(FeatureType.DATA, self.feature_name, red_edge[..., np.newaxis])
return eopatch
class MoistureStressIndex(EOTask):
"""
MSI - Simple Ratio 1600/820 Moisture Stress Index (MSI), where B11=1600nm and B8A=820nm
"""
def __init__(self, feature_name, band_a, band_b):
self.feature_name = feature_name
self.band_a_feature_name = band_a.split('/')[0]
self.band_b_feature_name = band_b.split('/')[0]
self.band_a_feature_idx = int(band_a.split('/')[-1])
self.band_b_feature_idx = int(band_b.split('/')[-1])
def execute(self, eopatch):
band_a = eopatch.data[self.band_a_feature_name][..., self.band_a_feature_idx]
band_b = eopatch.data[self.band_b_feature_name][..., self.band_b_feature_idx]
msi = band_a / band_b
eopatch.add_feature(FeatureType.DATA, self.feature_name, msi[..., np.newaxis])
return eopatch
我发现以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-106-8e91d24237c9> in <module>()
48
49 MCARI=ModifiedCholorophyllAbsorptionInReflectanceIndex((FeatureType.DATA,'BANDS'),(FeatureType.DATA, 'MCARI'),
---> 50 [band_names.index('B05'), band_names.index('B04'), band_names.index('B03')])
51
52 CRE=CholorophyllRedEdge((FeatureType.DATA,'BANDS'),(FeatureType.DATA, 'CRE'),
TypeError: __init__() missing 1 required positional argument: 'band_c'
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
47[波段名称.索引('B8A'),波段名称.索引('B11'))
48
--->49 MCARI=修改后的全息柱吸附反射指数((FeatureType.DATA,'MCARI')、波段名称.index('B05')、波段名称.index('B04')、波段名称.index('B03'))
50
51#CRE=cholorophylleddge((FeatureType.DATA,'BANDS'),(FeatureType.DATA,'CRE'),
in_uuuuinit_uuuuuuuuuuuuu(自我、特征名称、波段a、波段b、波段c)
56定义初始(自我、特征名称、波段a、波段b、波段c):
57 self.feature\u name=feature\u name
--->58 self.band_a_feature_name=band_a.split('/')[0]
59 self.band_b_feature_name=band_b.split('/')[0]
60 self.band_c_feature_name=band_c.split('/')[0]
AttributeError:“int”对象没有属性“split”
编辑2:
class NormalisedDifferenceIndex(EOTask): #GNDVI, NDRE, NDII, NDVI, NDWI
"""
Defined Normalised Difference Index (NDI) between two bands A and B as:
NDI = (A-B)/(A+B).
NDVI = (B08 - B04) / (B08 + B04)
NDWI = (B8A - B12) / (B8A + B12) <==> (NIR - MIR) / (NIR + MIR)
GNDVI = (B07 - B03) / (B07 + B03)
NRDE = (B8A - B05) / (B8A + B05) <==> (NIR - RE) / (NIR + RE)
NDII = (B8A - B11) / (B8A + B11)
"""
def __init__(self, feature_name, band_a, band_b):
self.feature_name = feature_name
self.band_a_feature_name = band_a.split('/')[0]
self.band_b_feature_name = band_b.split('/')[0]
self.band_a_feature_idx = int(band_a.split('/')[-1])
self.band_b_feature_idx = int(band_b.split('/')[-1])
def execute(self, eopatch):
band_a = eopatch.data[self.band_a_feature_name][..., self.band_a_feature_idx]
band_b = eopatch.data[self.band_b_feature_name][..., self.band_b_feature_idx]
ndi = (band_a - band_b) / (band_a + band_b)
eopatch.add_feature(FeatureType.DATA, self.feature_name, ndi[..., np.newaxis])
return eopatch
class NormalisedDifferenceIndex(EOTask):#GNDVI、NDRE、NDII、NDVI、NDWI
"""
将两个波段A和B之间的归一化差异指数(NDI)定义为:
NDI=(A-B)/(A+B)。
NDVI=(B08-B04)/(B08+B04)
NDWI=(B8A-B12)/(B8A+B12)(NIR-MIR)/(NIR+MIR)
GNDVI=(B07-B03)/(B07+B03)
NRDE=(B8A-B05)/(B8A+B05)(NIR-RE)/(NIR+RE)
NDII=(B8A-B11)/(B8A+B11)
"""
定义初始(自我、特征名称、波段a、波段b):
self.feature\u name=feature\u name
self.band_a_feature_name=band_a.split('/')[0]
self.band_b_feature_name=band_b.split('/')[0]
self.band_a_feature_idx=int(band_a.split('/')[-1])
self.band_b_feature_idx=int(band_b.split('/')[-1])
def执行(自我、eopatch):
band\u a=eopatch.data[self.band\u a\u feature\u name][…,self.band\u a\u feature\u idx]
band_b=eopatch.data[self.band_b_feature_name][…,self.band_b_feature_idx]
ndi=(波段a-波段b)/(波段a+波段b)
eopatch.add_功能(FeatureType.DATA,self.feature_名称,ndi[…,np.newaxis])
返回eopatch
我认为这是因为在构造函数(第49行)中有3个参数(2个元组,1个列表),而不是4个,所以Python无法读取第四个参数:“band c”我认为这是因为在构造函数(第49行)中有3个参数(2个元组,1个列表)而不是4,因此Python无法读取第四个参数:“band c”那么我如何解决这个问题呢?用逗号分隔每个参数,使其具有一个feature_name参数、一个band_a参数、一个band_b参数和一个band_c参数。PS:self不是要插入的参数。我尝试过了(查看编辑的帖子)它抛出了一个不同的错误。它说band_a(因此band_names.index('B05'))是一个int,没有属性split,因为split是用于字符串的。注意类型。如果是这种情况,那么规范化的差异索引是什么(参见第二次编辑)成功了?那我怎么能解决这个问题呢?用逗号分隔每个参数,让一个参数代表feature_name,一个参数代表band_a,一个参数代表band_b,一个参数代表band_c。PS:self不是一个要注入的参数。我试过了(看看编辑过的帖子),它抛出了一个不同的错误。它说band_a(所以band_names.index('B05'))是一个int,没有属性拆分,因为拆分是用于字符串的。请注意类型。如果是这种情况,那么规范化的差异索引(请参阅第二次编辑)的工作原理是什么?
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-105-f8397d36a69f> in <module>()
54
55 MSI=CholorophyllRedEdge((FeatureType.DATA,'BANDS'),(FeatureType.DATA, 'MSI'),
---> 56 [band_names.index('B11'), band_names.index('B8A')])
57
58
<ipython-input-104-595640f5ccf8> in __init__(self, feature_name, band_a, band_b)
85 def __init__(self, feature_name, band_a, band_b):
86 self.feature_name = feature_name
---> 87 self.band_a_feature_name = band_a.split('/')[0]
88 self.band_b_feature_name = band_b.split('/')[0]
89 self.band_a_feature_idx = int(band_a.split('/')[-1])
AttributeError: 'tuple' object has no attribute 'split'
MCARI=ModifiedCholorophyllAbsorptionInReflectanceIndex((FeatureType.DATA, 'MCARI'), band_names.index('B05'), band_names.index('B04'), band_names.index('B03'))
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-11-cece9d98413a> in <module>()
47 [band_names.index('B8A'), band_names.index('B11')])
48
---> 49 MCARI=ModifiedCholorophyllAbsorptionInReflectanceIndex((FeatureType.DATA, 'MCARI'), band_names.index('B05'), band_names.index('B04'), band_names.index('B03'))
50
51 #CRE=CholorophyllRedEdge((FeatureType.DATA,'BANDS'),(FeatureType.DATA, 'CRE'),
<ipython-input-9-595640f5ccf8> in __init__(self, feature_name, band_a, band_b, band_c)
56 def __init__(self, feature_name, band_a, band_b, band_c):
57 self.feature_name = feature_name
---> 58 self.band_a_feature_name = band_a.split('/')[0]
59 self.band_b_feature_name = band_b.split('/')[0]
60 self.band_c_feature_name = band_c.split('/')[0]
AttributeError: 'int' object has no attribute 'split'
class NormalisedDifferenceIndex(EOTask): #GNDVI, NDRE, NDII, NDVI, NDWI
"""
Defined Normalised Difference Index (NDI) between two bands A and B as:
NDI = (A-B)/(A+B).
NDVI = (B08 - B04) / (B08 + B04)
NDWI = (B8A - B12) / (B8A + B12) <==> (NIR - MIR) / (NIR + MIR)
GNDVI = (B07 - B03) / (B07 + B03)
NRDE = (B8A - B05) / (B8A + B05) <==> (NIR - RE) / (NIR + RE)
NDII = (B8A - B11) / (B8A + B11)
"""
def __init__(self, feature_name, band_a, band_b):
self.feature_name = feature_name
self.band_a_feature_name = band_a.split('/')[0]
self.band_b_feature_name = band_b.split('/')[0]
self.band_a_feature_idx = int(band_a.split('/')[-1])
self.band_b_feature_idx = int(band_b.split('/')[-1])
def execute(self, eopatch):
band_a = eopatch.data[self.band_a_feature_name][..., self.band_a_feature_idx]
band_b = eopatch.data[self.band_b_feature_name][..., self.band_b_feature_idx]
ndi = (band_a - band_b) / (band_a + band_b)
eopatch.add_feature(FeatureType.DATA, self.feature_name, ndi[..., np.newaxis])
return eopatch