我正在尝试根据存储的值是否为< 3来为数组分配新值。来自R背景,这是我将如何做到这一点,但这给了我Python中的语法错误。我做错了什么,Python方法是什么?
eurx=[1,2,3,4,5,6,7,'a',8]
sma50=3
tw=eurx
tw[eurx<sma50]=-1
tw[eurx>=sma50]=1
tw[(tw!=1)||(tw!=-1)]=0
print(tw)
目标:
-1
-1
1
1
1
1
1
0
1
答案 0 :(得分:1)
这太多了R&#34;。 pythonic方式是使用功能过滤:
>>> map(lambda i: -2*int(i<sma50)+1 if type(i) == int else 0, eurx)
[-1, -1, 1, 1, 1, 1, 1, 0, 1]
或者只是一个带有几个ifs的简单for循环:
>>> for i in eurx:
... if type(i) != int:
... print 0
... else:
... print -2*int(i<sma50)+1
...
-1
-1
1
1
1
1
1
0
1
一般情况下:不要试图猜测语法。它非常简单,只需阅读一些教程(例如https://docs.python.org/3/tutorial/introduction.html#first-steps-towards-programming)
修改:int
转换黑客的工作方式如下:您知道可以将bool转换为int,对吗?
>>> int(True)
1
>>> int(False)
0
如果i<sma50
评估为True,则int(i<sma50)
将为1.因此,如果i
小于sma50
,则现在转换为1,否则转换为0。但显然您希望使用值(-1, 1)
而不是(1, 0)
。只需应用转化-2x+1
即可完成!
答案 1 :(得分:1)
您所需的语法与您在numpy中所写的内容非常接近。
异构列表并不容易,但这是一个例子:
>>> import numpy as np
>>> eurx=[1,2,3,4,5,6,7,'a',8]
>>> sma50 = 3
>>> tw = np.array([i if isinstance(i, int) else np.nan for i in eurx])
>>> tw
array([ 1., 2., 3., 4., 5., 6., 7., nan, 8.])
>>> tw[tw < sma50] = -1
__main__:1: RuntimeWarning: invalid value encountered in less
>>> tw[tw >= sma50] = 1
__main__:1: RuntimeWarning: invalid value encountered in greater_equal
>>> tw
array([ -1., -1., 1., 1., 1., 1., 1., nan, 1.])
>>> tw[np.isnan(tw)] = 0
>>> tw
array([-1., -1., 1., 1., 1., 1., 1., 0., 1.])