вычисление взаимной информации с помощью cuy не быстрее, чем numy - PullRequest
0 голосов
/ 03 ноября 2019

Я рассчитываю взаимную информацию некоторых рядов скорости ветра. Когда я пытаюсь ускорить мой код с помощью cupy, но на самом деле он медленнее

Я вычисляю взаимную информацию как для numy, так и для cupy, и мои данные равны 1097 * 5000, версия numpy намного быстрее, чем версия cupy,Это мой первый раз, когда я использую stackoverflow, но до сих пор не могу понять, какой набор

numpy version "" "class MutualInformation_n (): def init (self, data, фракция, log_base):self.data = data self.fraction = фракция self.log_base = log_base [self.ncount, self.length] = self.data.shape self.p = {}

def discretize(self):

    dis_data = np.floor(self.data)

    return dis_data
def mi(self):

    dis_data = self.discretize()
    MI = np.zeros(shape=[self.ncount, self.ncount])
    values = {}
    for x_index in range(self.ncount):
        self.p[x_index] = {}
        values_x = set(dis_data[x_index])
        values[x_index] = values_x
        for value_x in values_x:
            px = shape(where(dis_data[x_index]==value_x))[1] / self.length
            self.p[x_index][value_x] = px
    for x_index in range(self.ncount):
        values_x = values[x_index]
        for y_index in range(x_index+1, self.ncount):
            summation = 0.0
            # Get uniques values of random variables
            values_y = values[y_index]
            # Print debug info
            # For each random
            for value_x in values_x:
                for value_y in values_y:
                    px = self.p[x_index][value_x]
                    py = self.p[y_index][value_y]
                    pxy = len(where(in1d(where(dis_data[x_index]==value_x)[0], 
                                    where(dis_data[y_index]==value_y)[0])==True)[0]) / self.length
                    if pxy>0:
                        summation += pxy * math.log((pxy / (px*py)), self.log_base)

            MI[x_index, y_index] = summation
            MI[y_index, x_index] = summation
    return MI

"" "Cupy версия"" "def in1d_c (ar1, ar2): mask = cp.zeros (len (ar1), dtype = bool) для in in ar2: mask | = (ar1 == a) вернуть маску

класс MutualInformation_c(): def init (self, data, log_base): self.data = data self.log_base = log_base [self.ncount, self.length] = self.data.shape self.p = {}

def discretize(self):

    dis_data = cp.floor(self.data)      
    return dis_data
def mi(self):
    dis_data = self.discretize()
    MI = cp.zeros(shape=[self.ncount, self.ncount])
    values = {}
    for x_index in range(self.ncount):
        self.p[x_index] = {}
        values_x = cp.unique(dis_data[x_index])
        values[x_index] = values_x
        for value_x in values_x:
            px = len(cp.where(dis_data[x_index]==value_x)[0]) / self.length
            self.p[x_index][int(value_x)] = px
    for x_index in range(self.ncount):
        values_x = values[x_index]
        for y_index in range(x_index+1, self.ncount):
            summation = 0.0
            # Get uniques values of random variables
            values_y = values[y_index]
            # Print debug info
            # For each random
            for value_x in values_x:
                for value_y in values_y:
                    px = self.p[x_index][int(value_x)]
                    py = self.p[y_index][int(value_y)]
                    pxy = len(cp.where(in1d_c(cp.where(dis_data[x_index]==value_x)[0], 
                                    cp.where(dis_data[y_index]==value_y)[0])==True)[0]) / self.length
                    if pxy>0:
                        summation += pxy * math.log((pxy / (px*py)), self.log_base)

            MI[x_index, y_index] = summation
            MI[y_index, x_index] = summation
    return MI

"" "

...