相关疑难解决方法(0)

一个python函数,它接受标量或numpy数组作为参数

正如标题所说,假设我想写一个符号函数(让我们暂时忘记符号(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是数组还是数字,但我想知道是否有更好的东西.如果你有很多像这样的小函数,编写分支代码会很麻烦.

python arrays numpy function

10
推荐指数
1
解决办法
4878
查看次数

将python函数广播到numpy数组

假设我们有一个特别简单的功能

import scipy as sp
def func(x, y):
   return x + y
Run Code Online (Sandbox Code Playgroud)

这个功能显然适用于几种内置Python数据类型xy像串,列表,整数,浮点,数组,等等.因为我们是在阵列特别感兴趣,我们考虑两个数组:

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)

python numpy scipy

7
推荐指数
2
解决办法
9736
查看次数

Numpy:inplace和explicit操作的奇怪的不同行为

我想操作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 arrays numpy in-place numpy-ndarray

7
推荐指数
1
解决办法
155
查看次数

获取Python函数以干净地返回标量或列表,具体取决于参数的数量

免责声明:我正在寻找一个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)

python python-2.x python-2.6 iterable-unpacking

5
推荐指数
2
解决办法
3896
查看次数