в то время как и работают с неподдерживаемым оператором в python - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь создать функцию для удаления данных со значениями z> 3 в списке, для этого я использую 'while', потому что после удаления этих значений в старом списке значения z> 3 в новом список может появиться снова. Затем это l oop должно выполняться до тех пор, пока z <= 3. </p>

Ошибка: невозможно выполнить сокращение с гибким типом

Код

import numpy as np

def removeout(lista):
    from scipy import stats
    from numpy import abs
    a = []
    z = abs(stats.zscore(lista))
    while any(i > 3 for i in z):


        for i, n in zip(lista, z):

            if i is 'Nan':
                a.append('Nan')
                continue
            elif n <= 3:
                b = i
            elif n > 3:
                b = 'Nan'

            a.append(b)

        lista = a.copy()
        z = abs(stats.zscore(lista))

    return lista


list1 = np.random.normal(500, 100, 1000)
new_list = removeout(list1)

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

похоже, что требуется приведение типа, поэтому тип не является гибким. Ниже приведен обновленный код ... пожалуйста, проверьте

import numpy as np

def removeout(lista):
    from scipy import stats
    from numpy import abs
    a = []
    z = abs(stats.zscore(lista.astype(np.float)))
    while any(i > 3 for i in z):


        for i, n in zip(lista, z):

            if i is 'Nan':
                a.append('Nan')
                continue
            elif n <= 3:
                b = i
            elif n > 3:
                b = 'Nan'

            a.append(b)

        lista = np.array(a.copy())
        z = abs(stats.zscore(lista.astype(np.float)))

    return lista


list1 = np.random.normal(500, 100, 1000)
new_list = removeout(list1)
print(new_list)
0 голосов
/ 18 июня 2020

Проблема вызывает

    lista = a.copy()

, потому что a является нормальным списком, но исходный lista был numpy.ndarray и позже stats.zscore() имеет проблемы при работе с этим списком.

Вы нужно создать numpy.array.

И ему нужен тип данных float, np.float или "float64" (по крайней мере, на моем компьютере).

    lista = np.array(a).astype('float64')

import numpy as np
from scipy import stats

def removeout(lista):
    a = []

    #print('[DEBUG] first')
    #print('[DEBUG]', type(lista), lista.dtype)

    z = np.abs(stats.zscore(lista))

    while any(i > 3 for i in z):


        for i, n in zip(lista, z):

            if i is 'Nan':
                a.append('Nan')
                continue
            elif n <= 3:
                b = i
            elif n > 3:
                b = 'Nan'

            a.append(b)

        lista = np.array(a).astype('float64')

        #print('[DEBUG] second')
        #print('[DEBUG]', type(lista), lista.dtype)

        z = np.abs(stats.zscore(lista))

    return lista

list1 = np.random.normal(500, 100, 1000)
#print('[DEBUG] start')
#print('[DEBUG]', type(list1), list1.dtype)

new_list = removeout(list1)
print(new_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...