如何使用 Python numpy.where() 方法

在Python中,我们可以使用 **numpy.where() 函数来根据条件从 numpy 数组中选择元素。

不仅如此,如果满足条件,我们还可以在这些元素上执行一些操作。

让我们看看我们如何使用这个功能,使用一些示范的例子!


Python 的语法 numpy.where()

此函数接受类似 numpy 的数组(例如 [NumPy]( / 社区 / 教程 / Python-numpy - 教程)整数 / 布尔数组)。

它返回一个新的 numpy 数组,经过基于 condition的过滤,这是一个 numpy 值的数组。

例如,条件可以取数组([[True, True, True]]])的值,这是一种模糊的布尔数组(默认情况下,NumPy 仅支持数字值,但我们也可以将它们扔到bool`)。

例如,如果条件数列([真,真,假]),而我们的数列是a = ndarray([[1, 2, 3]]),在应用条件到数列(a[:条件])时,我们将获得数列ndarray([1 2]])

1import numpy as np
2
3a = np.arange(10)
4print(a[a <= 2]) # Will only capture elements <= 2 and ignore others

出发点( )

1array([0 1 2])

**注:相同的条件条件也可以表示为 a <= 2. 这是条件数组的推荐格式,因为它作为布尔数组写作非常无聊。

但是,如果我们想要保持结果的尺寸,而不是丢失我们原始数组中的元素呢?我们可以使用 **numpy.where()**来实现这一点。

1numpy.where(condition [, x, y])

我们还有两个参数xy

基本上,这意味着如果条件对我们数组中的某个元素是正确的,那么新数组将从x中选择元素。

否则,如果它是假的,则将从y中提取元素。

因此,我们的最终输出数组将是一个从xcondition = True的元素数组,以及从ycondition = False的元素数组。

请注意,虽然xy是可选的,但如果您指定x,则您也必须指定y

**注:同样的逻辑适用于单维和多维数组,在这两种情况下,我们根据条件过滤。

现在,让我们看看一些例子,以正确理解这个功能。


使用 Python numpy.where( )

假设我们只想从一个 numpy 数组中提取积极元素,并将所有负元素设置为 0,让我们使用 'numpy.where()' 来写代码。

用 numpy.where() 取代元素

在这里,我们将使用2维随机数组,并只输出积极元素。

 1import numpy as np
 2
 3# Random initialization of a (2D array)
 4a = np.random.randn(2, 3)
 5print(a)
 6
 7# b will be all elements of a whenever the condition holds true (i.e only positive elements)
 8# Otherwise, set it as 0
 9b = np.where(a > 0, a, 0)
10
11print(b)
  • 可能的输出*
1[[-1.06455975 0.94589166 -1.94987123]
2 [-1.72083344 -0.69813711 1.05448464]]
3[[0. 0.94589166 0.        ]
4 [0. 0. 1.05448464]]

正如你所看到的,现在只保留了积极的元素!

使用 numpy.where() 只有一个条件

关于上述代码可能有些混淆,因为你们中的一些人可能会认为,更直观的方法就是简单地写下这样的条件:

1import random
2import numpy as np
3
4a = np.random.randn(2, 3)
5b = np.where(a > 0)
6print(b)

如果您现在尝试运行上述代码,通过此更改,您将得到这样的输出:

1(array([0, 1]), array([2, 1]))

如果你仔细观察,‘b’现在是无数数组的双数组,每个数组都是积极元素的位置,这意味着什么?

每当我们提供一个条件时,这个函数实际上相当于「np.asarray.nonzero()」。

在我们的示例中, np.asarray(a > 0) 将应用条件后返回布尔式数组,而 np.nonzero(arr_like) 将返回 `arr_like' 的非零元素的索引。

因此,我们现在将看看一个更简单的例子,这向我们展示了我们如何灵活地使用numpy!

1import numpy as np
2
3a = np.arange(10)
4
5b = np.where(a < 5, a, a * 10)
6
7print(a)
8print(b)

外出

1[0 1 2 3 4 5 6 7 8 9]
2[ 0 1 2 3 4 50 60 70 80 90]

在这里,条件是a < 5,这将是模糊的数组`[真实真实真实真实假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假假

因此,这将所有元素 >= 5 转化为 10,这就是我们确实得到的!


使用 numpy.where( )播放

如果我们提供所有条件,xy数组,numpy 会将它们播放在一起。

 1import numpy as np
 2
 3a = np.arange(12).reshape(3, 4)
 4
 5b = np.arange(4).reshape(1, 4)
 6
 7print(a)
 8print(b)
 9
10# Broadcasts (a < 5, a, and b * 10)
11# of shape (3, 4), (3, 4) and (1, 4)
12c = np.where(a < 5, a, b * 10)
13
14print(c)

出发点( )

1[[ 0 1 2 3]
2 [ 4 5 6 7]
3 [ 8 9 10 11]]
4[[0 1 2 3]]
5[[ 0 1 2 3]
6 [ 4 10 20 30]
7 [ 0 10 20 30]]

再一次,这里的输出是根据条件选择的,所以所有的元素,但在这里,b被播放到a的形状(其中一个尺寸只有一个元素,所以在播放过程中不会有错误)

因此,b现在将成为[[0 1 2 3] [0 1 2 3] [0 1 2 3],现在,我们甚至可以从这个广播的数组中选择元素。

因此,输出的形状与a的形状相同。


结论

在本文中,我们了解了如何使用Python **numpy.where()**函数来选择基于另一个条件数组的数组。


参考


Published At
Categories with 技术
Tagged with
comments powered by Disqus