将条件逻辑作为数组操作
2019-01-30 本文已影响4人
庵下桃花仙
numpy.where 函数是三元表达式x if condition else y
的向量化版本。
In [72]: xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
In [73]: yarr = np.array([2.1, 2.2 , 2.3, 2.4, 2.5])
In [75]: cond = np.array([True, False, True, True, False])
In [77]: result = [(x if c else y)
...: for x, y, c in zip(xarr, yarr, cond)] # 列表表达式
In [78]: result
Out[78]: [1.1, 2.2, 1.3, 1.4, 2.5]
缺点:首先,数组很大的化,速度很慢;其次,数组多维时,无法奏效。
In [79]: result = np.where(cond, xarr, yarr)
In [80]: result
Out[80]: array([1.1, 2.2, 1.3, 1.4, 2.5])
np.where
典型用法是根据一个数组生成一个新的数组。
In [81]: arr = np.random.randn(4, 4)
In [82]: arr
Out[82]:
array([[ 0.11080898, -1.00572741, 1.45813919, 1.34513378],
[-0.1267906 , 0.06126648, 0.38987613, -0.26484398],
[-0.54729732, -1.87361921, 0.54933943, 1.01996784],
[ 1.79025451, -1.12314291, -0.3137941 , -0.74643305]])
In [83]: arr > 0
Out[83]:
array([[ True, False, True, True],
[False, True, True, False],
[False, False, True, True],
[ True, False, False, False]])
In [84]: np.where(arr > 0, 2, -2)
Out[84]:
array([[ 2, -2, 2, 2],
[-2, 2, 2, -2],
[-2, -2, 2, 2],
[ 2, -2, -2, -2]])
In [86]: np.where(arr > 0, 2, arr)
Out[86]:
array([[ 2. , -1.00572741, 2. , 2. ],
[-0.1267906 , 2. , 2. , -0.26484398],
[-0.54729732, -1.87361921, 2. , 2. ],
[ 2. , -1.12314291, -0.3137941 , -0.74643305]])