正如标题所述,假设我想编写一个符号函数(现在先忘记sign(0)),显然我们期望sign(2) = 1以及sign(array([-2,-2,2])) = array([-1,-1,1])。然而,下面的函数并不能处理numpy数组。
def sign(x):
if x>0: return 1
else: return -1
下一个函数也行不通,因为如果 x 只是一个单独的数字,则它没有形状成员。即使使用某些技巧,如 y = x*0 + 1,y 也没有 [] 方法。def sign(x):
y = ones(x.shape)
y[x<0] = -1
return y
即使参考了另一个问题的想法(如何制作一个可以接受numpy数组、可迭代对象或标量的numpy函数?),下面的函数在x是单个数字时将无法工作,因为在这种情况下,x.shape和y.shape只是(),索引y是非法的。def sign(x):
x = asarray(x)
y = ones(x.shape)
y[x<0] = -1
return y
唯一的解决方案似乎是首先确定x是数组还是数字,但我想知道是否有更好的方法。如果您有很多这样的小函数,编写带分支的代码将非常麻烦。
y
进行索引是合法的:这里的问题在于x < 0
再次成为标量而不是零维数组。如果您尝试y[asarray(x < 0)]
,它应该可以工作。 - Mark Dickinsonnp.sign
函数的可能性? - Jaimex = asarray(x)
。 - Mark Dickinson