更新数组调用类

时间:2017-01-31 13:31:49

标签: python numpy

我有这段代码:

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)

所以,我想计算整个数组的平均值。

3 个答案:

答案 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