指定numpy数组的二维数组函数返回值

问题描述:

我有一个完美的函数。它需要一个numpy的二维数组,然后做一些数组然后返回。 我尝试使用返回值来填充条件的数组。看下面的代码:指定numpy数组的二维数组函数返回值

>>> import numpy as np 
>>> x=np.random.randint(20, size=(4,5)) 
>>> y=np.zeros_like(x) * np.nan 
>>> x 
array([[19, 0, 6, 17, 5], 
     [18, 18, 10, 19, 9], 
     [ 2, 5, 10, 5, 15], 
     [ 9, 3, 0, 6, 9]]) 
>>> y 
array([[ nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan]]) 
>>> y[ x>15 ] = 1000 
>>> y 
array([[ 1000., nan, nan, 1000., nan], 
     [ 1000., 1000., nan, 1000., nan], 
     [ nan, nan, nan, nan, nan], 
     [ nan, nan, nan, nan, nan]]) 

问题是当添加一个函数时。

>>> def foo(x): 
    return x*2 

>>> y[ x>15 ] = foo(x) 

Warning (from warnings module): 
    File "__main__", line 1 
FutureWarning: assignment exception type will change in the future 
Traceback (most recent call last): 
    File "<pyshell#59>", line 1, in <module> 
    y[ x>15 ] = foo(x) 
ValueError: boolean index array should have 1 dimension 

或类似的东西:

>>> _=foo(x) 
>>> y[ x>15 ]=_ 
Traceback (most recent call last): 
    File "<pyshell#64>", line 1, in <module> 
    y[ x>15 ]=_ 
ValueError: boolean index array should have 1 dimension 

为什么它不工作了!?

+0

为什么你想要一个nan而不是0的矩阵? –

+2

第一次尝试使用标量。在第二个你有一个二维数组。它们的大小不匹配。你可以使用'np.where(x> 15,foo(x),y​​)'。 – ayhan

+0

@IgnacioVergaraKausel我有一些条件。在其中一个中,y必须是0,而在其他y中必须是1,否则y必须是nan。我需要nan的。 –

你的主要问题是,一个布尔值索引的数组返回一维数组,因此:

y[x > 15] 
[Out]: array([nan, nan, nan, nan, nan]) 

所以,如果你想分配给它,你需要同样大小的一维数组(或东西广播到1d,就像你在第一个例子中做的0d标量)。

因此,无论布尔切片您输入

y[x > 15] = foo(x[x > 15]) # or 
y[x > 15] = foo(x)[x > 15] 

或者使用np.where,它保留了形状。

y = np.where(x > 15, foo(x), y) 

第一个选项更快,但np.where通常更清晰和可扩展。