【发布时间】:2014-12-19 23:29:04
【问题描述】:
正如标题所说,假设我想写一个符号函数(让我们暂时忘记 sign(0)),显然我们期望 sign(2) = 1 和 sign(array([-2,-2,2] )) = 数组([-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
即使有另一个问题的想法(how can I make a numpy function that accepts a numpy array, an iterable, or a scalar?),当 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又是一个标量而不是一个0-d 数组。如果您尝试y[asarray(x < 0)],它应该可以工作。 -
你考虑过使用内置
np.sign的可能性吗? -
@MarkDickinson 这是一个很好的方法,但是当 x 是单个数字时它会出错,因为现在 y 也必须是单个数字 - 然后 y 无法被索引...跨度>
-
@Jaime 符号函数只是举例,我应该在数学中使用类似分段函数的东西。 BTW 你知道 numpy 是如何实现 sign 函数的吗?
-
@桃子:对;如果您想采用这种方法,您仍然需要在开始时使用
x = asarray(x)。
标签: python arrays function numpy