指定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
为什么它不工作了!?
答
你的主要问题是,一个布尔值索引的数组返回一维数组,因此:
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
通常更清晰和可扩展。
为什么你想要一个nan而不是0的矩阵? –
第一次尝试使用标量。在第二个你有一个二维数组。它们的大小不匹配。你可以使用'np.where(x> 15,foo(x),y)'。 – ayhan
@IgnacioVergaraKausel我有一些条件。在其中一个中,y必须是0,而在其他y中必须是1,否则y必须是nan。我需要nan的。 –