分配值以覆盖python数组

时间:2017-12-17 20:39:47

标签: python arrays

我正在尝试根据存储的值是否为< 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

2 个答案:

答案 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.])