我有这段代码:
class MyClass():
def __init__(self, the_name, the_method):
self.the_name = the_name
self.the_method = the_method
def evaluation(self, the_name):
the_name = self.the_name
the_method = self.the_method
if the_method == 'A':
the_name = np.where(
np.logical_or(
the_name < themin,
the_name > themax),
the_name, self.replace(the_name)
)
return the_name
def replace(self, the_name):
the_name = self.the_name
the_method = self.the_method
the_name[:] = 3333
return the_name
the_method = 'A'
themin = 30
themax = 100
the_name = np.array([1, 22, 36, 34, 49, 60, 79, 101, 124, 147])
theobj = MyClass(the_name, the_method).evaluation(the_name)
print(the_name)
结果:[3333 3333 3333 3333 3333 3333 3333 3333 3333 3333]
我首先检查评估方法,如果我想要的方法是一个(在这个例子中是A
方法)。
然后,我想申请一些标准。如果是the_name is < themin or > themax
的值,则保留the_name
的特定元素。
如果不是,请调用replace
方法。
但是,我希望替换方法对更新的the_name
进行操作。
现在,结果是错误的。
我希望[1 22 3333 3333 3333 3333 3333 101 124 147]
为结果。
----另一个senario -----------
如果我有这样的话:
def evaluation(self, array):
if self.the_method == 'A':
if np.any(array < themin):
self.replace(array)
return array
def replace(self, array):
return np.average(array)
所以,我想计算整个数组的平均值。
答案 0 :(得分:2)
class MyClass():
def __init__(self, the_name, the_method):
self.the_name = the_name
self.the_method = the_method
def replace(self, item):
item = 3333
return item
def evaluation(self, array):
if self.the_method == 'A':
array = [self.replace(x) if ((x>themin)&(x<themax)) else x for x in array]
return array
the_method = 'A'
themin = 30
themax = 100
the_name = np.array([1, 22, 36, 34, 49, 60, 79, 101, 124, 147])
theobj = MyClass(the_name, the_method).evaluation(the_name)
print(theobj)
出:
[1, 22, 3333, 3333, 3333, 3333, 3333, 101, 124, 147]
希望有所帮助
答案 1 :(得分:1)
为什么要使用np.where
?您可以使用boolean indexing简单地替换符合特定条件的数组的所有元素:
mask = np.logical_and(the_name >= themin, the_name <= themax)
the_name[mask] = the_name.mean() # or 3333
应该做的伎俩。所以完整的代码看起来像这样:
import numpy as np
class MyClass():
def __init__(self, the_name, the_method):
self.the_name = the_name
self.the_method = the_method
def evaluation(self, the_name):
the_name = self.the_name
the_method = self.the_method
if the_method == 'A':
mask = np.logical_and(the_name >= themin, the_name <= themax)
the_name[mask] = self.replace(the_name)
return the_name
def replace(self, the_name):
return the_name.mean() # or 3333?
the_method = 'A'
themin = 30
themax = 100
the_name = np.array([1, 22, 36, 34, 49, 60, 79, 101, 124, 147])
theobj = MyClass(the_name, the_method).evaluation(the_name)
print(the_name)
结果:
对于mean
版本:[ 1 22 65 65 65 65 65 101 124 147]
对于3333
版本:[ 1 22 3333 3333 3333 3333 3333 101 124 147]
我不确定the_name = self.the_name
开头的evaluation
是否真的按照你的想法行事。
答案 2 :(得分:0)
此处的问题在您的替换方法中。行the_name[:] = 3333
正在用一个3333的数组替换self.the_name
。如果您更改替换以返回相同长度的新数组,并填充3333,那么您的代码现在可以正常工作。
np.where会在逻辑失败时从此数组中选择3333,或者如文档中所示:https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html