numpy中有功能吗?

时间:2013-05-17 10:02:24

标签: python numpy scipy pandas series

我有三个系列。我需要按元素执行以下操作:

  1. 比较第一和第二系列的值。
  2. 如果第一个较大,则从第三个系列中取出元素的弧 - 窦。
  3. 否则取弧 - 余弦。
  4. 这是我到目前为止所做的事情:

    numpy.if(numpy.less(s1,s2),numpy.arcsin(s3),numpy.arccos(s3))
    

    不幸的是,如果不起作用,因为numpy.if不存在。有没有办法克服这个问题?

2 个答案:

答案 0 :(得分:5)

我认为您正在寻找numpy.where

np.where(s1<s2, np.arcsin(s3), np.arccos(s3))

对于1D输入,

where(condition, [x, y])

相当于

[xv if c else yv for (c,xv,yv) in zip(condition,x,y)]

答案 1 :(得分:0)

unutbu做得很棒。我提出了一个没有where的等价物(但无论如何都是numpy

import numpy as np

s1=[2,1,2,5,4,6]
s2=[1,2,4,5,7,8]
s3=[0.1,0.4,0.5,0.6,0.1,0.1]

res = [xv if c else yv for (c,xv,yv) in zip([si1<si2 
          for si1,si2 in zip(s1,s2)], list(np.arcsin(s3)), list(np.arccos(s3)))]

如果您打印zip(),则会获得此列表

>>> 
[(False, 0.1001674211615598, 1.4706289056333368), (True, 0.41151684606748806, 1.1592794807274085), (True, 0.52359877559829893, 1.0471975511965979), (False, 0.64350110879328437, 0.9272952180016123), (True, 0.1001674211615598, 1.4706289056333368), (True, 0.1001674211615598, 1.4706289056333368)]

取第一项(False, 0.1001674211615598, 1.4706289056333368)2<1确实是假的。因此,1.4706289056333368中的res作为第一个值。

结果是

>>> res
[1.4706289056333368, 0.41151684606748806, 0.52359877559829893, 
            0.9272952180016123, 0.1001674211615598, 0.1001674211615598]