while 和函数在 python 中使用不受支持的运算符

Posted

技术标签:

【中文标题】while 和函数在 python 中使用不受支持的运算符【英文标题】:while and function with unsuported operator in python 【发布时间】:2020-10-07 21:15:43 【问题描述】:

我正在尝试创建一个函数来删除列表中 z 值大于 3 的数据,为此我使用“while”,因为在删除旧列表中的值之后,新列表中的 z 值 > 3列表可以再次出现。然后,这个循环应该一直持续到 z

错误是:不能用灵活类型执行reduce

代码

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)

【问题讨论】:

总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图)放在有问题的(不是评论)中。还有其他有用的信息。 error 显示您在哪一行有问题 - 所以使用 print() 和 print(type(..))` 查看您在这一行中使用的变量中的值。并在文档中检查该行中使用的函数的期望值。似乎zscore 期望与numpy.array 有所不同 谷歌搜索错误会产生这个问题:***.com/questions/28393103/…。问题是'nan',它是一个字符串。尝试无或 np.nan。 当我生成较小的列表时代码对我有用 - 即 np.random.normal(500, 100, 10) 或我生成大列表但使用 np.random.rand 嘿,OP,numpy 有一个惊人的屏蔽系统,它可以让你像这样直接删除那些优于三个的值:X = X[X &lt;= 3] 【参考方案1】:

看起来需要类型转换,因此它们的类型不灵活 以下是更新后的代码...请检查

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)

【讨论】:

【参考方案2】:

问题出在

    lista = a.copy()

因为a 是普通列表,但原来的listanumpy.ndarray 和后来的stats.zscore() 无法使用此列表。

你必须创建numpy.array

它需要数据类型floatnp.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)

【讨论】:

以上是关于while 和函数在 python 中使用不受支持的运算符的主要内容,如果未能解决你的问题,请参考以下文章

(转)阿里云出现身份验证错误,要求的函数不受支持的解决办法

发生身份验证错误 要求的函数不受支持

客户端正在使用不受支持的 Socket.IO 或 Engine.IO 协议版本错误

win10远程桌面连接要求的函数不受支持

远程桌面身份验证错误,函数不受支持

桌面远程:发生身份验证错误 要求的函数不受支持