Python numpy where 用法

本文深入解析NumPy库中的where函数的两种使用方式:一是作为三元操作符,根据条件选择输出x或y;二是作为查找工具,返回满足条件元素的索引。通过实例演示了如何在不同场景下应用该函数。

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.where.html

https://www.cnblogs.com/massquantity/p/8908859.html

 

numpy.where() 有两种用法:

1. np.where(condition, x, y)

满足条件(condition),输出x,不满足输出y。

如果是一维数组,相当于[xv if c else yv for (c,xv,yv) in zip(condition,x,y)]

>>> aa = np.arange(10)
>>> np.where(aa,1,-1)
array([-1,  1,  1,  1,  1,  1,  1,  1,  1,  1])  # 0为False,所以第一个输出-1
>>> np.where(aa > 5,1,-1)
array([-1, -1, -1, -1, -1, -1,  1,  1,  1,  1])

>>> np.where([[True,False], [True,True]],    # 官网上的例子
             [[1,2], [3,4]],
             [[9,8], [7,6]])
array([[1, 8],
       [3, 4]])

上面这个例子的条件为[[True,False], [True,False]],分别对应最后输出结果的四个值。第一个值从[1,9]中选,因为条件为True,所以是选1。第二个值从[2,8]中选,因为条件为False,所以选8,后面以此类推。类似的问题可以再看个例子:

>>> a = 10
>>> np.where([[a > 5,a < 5], [a == 10,a == 7]],
             [["chosen","not chosen"], ["chosen","not chosen"]],
             [["not chosen","chosen"], ["not chosen","chosen"]])

array([['chosen', 'chosen'],
       ['chosen', 'chosen']], dtype='<U10')

 

2. np.where(condition)

只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标 (等价于numpy.nonzero)。这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。

>>> a = np.array([2,4,6,8,10])
>>> np.where(a > 5)             # 返回索引
(array([2, 3, 4]),)   
>>> a[np.where(a > 5)]              # 等价于 a[a>5]
array([ 6,  8, 10])

>>> np.where([[0, 1], [1, 0]])
(array([0, 1]), array([1, 0]))

上面这个例子条件中[[0,1],[1,0]]的真值为两个1,各自的第一维坐标为[0,1],第二维坐标为[1,0] 。


下面看个复杂点的例子:

>>> a = np.arange(27).reshape(3,3,3)
>>> a
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

>>> np.where(a > 5)
(array([0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2]),
 array([2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2]),
 array([0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]))


# 符合条件的元素为
       [ 6,  7,  8]],

      [[ 9, 10, 11],
       [12, 13, 14],
       [15, 16, 17]],

      [[18, 19, 20],
       [21, 22, 23],
       [24, 25, 26]]]

所以np.where会输出每个元素的对应的坐标,因为原数组有三维,所以tuple中有三个数组。

<think>好的,我需要帮助用户了解如何在Python中使用NumPywhere函数。首先,我得回忆一下自己之前学过的关于NumPy的知识,尤其是where函数的用法。记得where函数主要用于根据条件选择数组中的元素,可以返回符合条件的元素的索引或者替换值。 用户提供的引用内容中有几个相关的部分,比如引用[3]提到where函数用于根据条件选择元素,返回符合条件的元素或索引,适用于替换数组中的值、筛选数据等。引用[4]和引用[5]则给出了一些示例,比如使用数组arr = np.array([1,2,3,4,5]),以及argmax和argmin的例子,但可能需要结合到where函数的应用场景中。 首先,我应该介绍where函数的基本语法:np.where(condition, [x, y])。当只传入condition时,返回满足条件的元素的索引;当传入condition、x、y时,根据条件选择x或y的值。需要分情况说明,并举例子。 接下来,根据用户提供的示例,比如引用[4]中的示例一是索引筛选,可能是指使用where函数获取满足条件的元素的索引。然后,用户可能还需要替换值的例子,比如将满足条件的元素替换为一个值,不满足的替换为另一个值。 需要注意的是,引用的内容中有些是关于fromfunction、repeat、argmax/argmin等,但用户的问题集中在where函数,所以需要集中讨论where用法,但可能需要适当关联其他函数,如果有必要的话。不过根据用户的问题,主要关注where,所以其他函数可能暂时不需要深入。 然后,我需要按照用户的要求,生成相关问题。问题应该与where函数相关,比如应用场景、与其他函数的比较、多维数组处理、性能优化等。 在整理回答结构时,应该分步骤说明,比如基本用法、返回索引、条件替换、多维数组处理等。每个部分都应有示例代码,并参考用户提供的引用内容中的例子,比如引用[4]中的arr数组,可以用于示例中。同时,确保所有的数学表达式使用$...$格式,比如数组的索引等。 需要检查是否有遗漏的点,比如是否提到多维数组的情况,或者where函数在数据分析中的实际应用。同时,确保回答符合用户的要求:结构清晰,分步解决问题,真实可靠,并正确引用提供的参考内容。 最后,生成的相关问题需要与where函数紧密相关,帮助用户进一步深入学习。例如,where函数与逻辑运算符的结合使用,性能方面的考虑,或者在不同形状数组下的广播机制等。</think>### 如何使用 NumPy 的 `where` 函数 NumPy 的 `np.where` 函数是一个强大的条件筛选工具,可根据条件对数组元素进行**索引提取**或**值替换**。以下是具体用法和示例: --- #### 1. **基本语法** ```python numpy.where(condition, [x, y]) ``` - **仅传入 `condition`**:返回满足条件的元素索引(元组形式)[^3]。 - **传入 `condition, x, y`**:满足条件的元素替换为 `x`,否则替换为 `y`。 --- #### 2. **返回满足条件的索引** 当仅传入条件时,`where` 返回符合条件的元素索引。例如: ```python import numpy as np arr = np.array([1, 2, 3, 4, 5]) indices = np.where(arr > 3) print(indices) # 输出:(array([3, 4], dtype=int64),) ``` 这里返回索引 `3` 和 `4`,对应元素 `4` 和 `5`[^4]。 --- #### 3. **条件替换:根据条件修改值** 通过 `np.where(condition, x, y)` 可快速替换元素: ```python arr = np.array([1, 2, 3, 4, 5]) result = np.where(arr % 2 == 0, "偶数", "奇数") print(result) # 输出:['奇数' '偶数' '奇数' '偶数' '奇数'] ``` - 将偶数替换为 `"偶数"`,奇数替换为 `"奇数"`。 --- #### 4. **多维数组处理** `where` 函数同样适用于多维数组。例如,筛选矩阵中大于 3 的元素: ```python matrix = np.array([[2, 1, 3], [4, 5, 6]]) indices = np.where(matrix > 3) print(indices) # 输出:(array([1, 1, 1], dtype=int64), array([0, 1, 2], dtype=int64)) ``` 返回的索引对应位置为 `(1,0)`(值4)、`(1,1)`(值5)、`(1,2)`(值6)[^5]。 --- #### 5. **与其他函数结合使用** 例如,将 `where` 与 `argmax` 结合,找到最大值并替换: ```python arr = np.array([1, 5, 3, 4, 2]) max_index = arr.argmax() # 输出:1(对应值5) result = np.where(arr == arr.max(), "最大值", arr) print(result) # 输出:['1' '最大值' '3' '4' '2'] ``` 这里将最大值替换为字符串 `"最大值"`[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值