正如标题所说,假设我想写一个符号函数(让我们暂时忘记符号(0)),显然我们期望sign(2)= 1和sign(array([ - 2,-2,2]))=阵列([ - 1,-1,1]).但是,以下函数不起作用,因为它无法处理numpy数组.
def sign(x):
if x>0: return 1
else: return -1
Run Code Online (Sandbox Code Playgroud)
下一个函数将无法工作,因为x只有一个形状成员,如果它只是一个数字.即使使用y = x*0 + 1这样的技巧,y也不会有[]方法.
def sign(x):
y = ones(x.shape)
y[x<0] = -1
return y
Run Code Online (Sandbox Code Playgroud)
即使有另一个问题的想法(如何创建接受numpy数组,可迭代或标量的numpy函数?),当x是单个数字时,下一个函数将不起作用,因为在这种情况下x.shape和y.shape只是()和索引y是非法的.
def sign(x):
x = asarray(x)
y = ones(x.shape)
y[x<0] = -1
return y
Run Code Online (Sandbox Code Playgroud)
唯一的解决方案似乎是首先确定x是数组还是数字,但我想知道是否有更好的东西.如果你有很多像这样的小函数,编写分支代码会很麻烦.
假设我们有一个特别简单的功能
import scipy as sp
def func(x, y):
return x + y
Run Code Online (Sandbox Code Playgroud)
这个功能显然适用于几种内置Python数据类型x和y像串,列表,整数,浮点,数组,等等.因为我们是在阵列特别感兴趣,我们考虑两个数组:
x = sp.array([-2, -1, 0, 1, 2])
y = sp.array([-2, -1, 0, 1, 2])
xx = x[:, sp.newaxis]
yy = y[sp.newaxis, :]
>>> func(xx, yy)
Run Code Online (Sandbox Code Playgroud)
这回来了
array([[-4, -3, -2, -1, 0],
[-3, -2, -1, 0, 1],
[-2, -1, 0, 1, 2],
[-1, 0, 1, 2, 3],
[ 0, 1, 2, 3, 4]])
Run Code Online (Sandbox Code Playgroud)
正如我们所期望的那样.
现在,如果想要将数组作为以下函数的输入?
def func2(x, y):
if x > y:
return x …Run Code Online (Sandbox Code Playgroud) 我想操作numpy数组来使用它们的索引,我想要包含0维的情况.现在我遇到了一个奇怪的情况,如果我不使用就地乘法,则会出现类型转换:
In [1]: import numpy as np
In [2]: x = 1.*np.array(1.)
In [3]: y = np.array(1.)
In [4]: y *= 1.
In [5]: x
Out[5]: 1.0
In [6]: y
Out[6]: array(1.)
In [7]: type(x)
Out[7]: numpy.float64
In [8]: type(y)
Out[8]: numpy.ndarray
Run Code Online (Sandbox Code Playgroud)
为什么x的类型与y不同?我知道,inplace操作是不同的实现,他们不创建数组的副本,但我不明白,为什么类型被更改,如果我将一个0d数组与浮点数相乘?它适用于1d阵列:
In [1]: import numpy as np
In [2]: x = np.array(1.)
In [3]: y = np.array([1.])
In [4]: 1.*x
Out[4]: 1.0
In [5]: 1.*y
Out[5]: array([1.])
In [7]: type(1.*x)
Out[7]: numpy.float64
In [8]: type(1.*y)
Out[8]: numpy.ndarray
Run Code Online (Sandbox Code Playgroud)
我想,这很奇怪......现在我遇到了以下问题,我必须分别处理0d数组: …
免责声明:我正在寻找一个Python 2.6解决方案,如果有的话.
我正在寻找一个函数,当传递单个值时返回单个值,或者在传递多个值时返回一个序列:
>>> a = foo(1)
2
>>> b, c = foo(2, 5)
>>> b
3
>>> c
6
Run Code Online (Sandbox Code Playgroud)
要清楚,这是为了使一些函数调用看起来比以下更好:
a, = foo(1)
Run Code Online (Sandbox Code Playgroud)
要么
a = foo(1)[0]
Run Code Online (Sandbox Code Playgroud)
现在,不优雅的解决方案是这样的:
def foo(*args):
results = [a + 1 for a in args]
return results if len(results) > 1 else results[0]
Run Code Online (Sandbox Code Playgroud)
是否有任何语法糖(或功能)会让这感觉更清洁?以下任何事情?
def foo(*args):
return *[a + 1 for a in args]
Run Code Online (Sandbox Code Playgroud)