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 <= 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
是普通列表,但原来的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)
【讨论】:
以上是关于while 和函数在 python 中使用不受支持的运算符的主要内容,如果未能解决你的问题,请参考以下文章