首先numpy.where(condition, x=None, y=None)可接收三个参数,condition表示待操作的numpy.array类型数组的逻辑判断, x和y是可选参数。
用法一:
当x,y为默认值时,对应用法一,此时where的作用为寻找在参数condition情况下数组内匹配的值,对于不同的输入,其返回python中numpy.where的两种用法以及zip()的用法的值是不同的。
当输入(参数)是一维数组时,返回值是一维的索引,只有一组索引数组。
>>> import numpy as np
>>> a = np.array([5, 6, 7, 1, 2, 8, 9, 3, 4])
>>> a
array([5, 6, 7, 1, 2, 8, 9, 3, 4])
>>> np.where(a < 5)
(array([3, 4, 7, 8], dtype=int64),)
说明原数组a中索引值为3,4,7,8的数组元素他们的值是小于5的。
当输入是二维数组时,返回的是匹配值的位置索引,但是注意会有两组索引数组表示返回值的位置。
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b = np.where(a < 5)
print(b)
该段代码返回的结果为:
(array([0, 0, 0, 1], dtype=int64), array([0, 1, 2, 0], dtype=int64))
这两个返回的数组索引,分别对应满足情况的值在行列(维度)上的索引。
所以对应位置[0, 0],[0, 1],[0, 2], [1, 0] 上的元素值小于5。
如果此时想将返回值按坐标点的形式显示,就要用到Python中自带的zip函数
# 函数zip()用可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回这些元组组成的列表
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b = np.where(a < 5)
for i in zip(*b):
print(i)
输出:
(0, 0)
(0, 1)
(0, 2)
(1, 0)
用法二:
当x,y不为None时,对应用法二,此时函数类似二值化阈值处理
import numpy as np
a = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b = np.where(a < 5, 0, 10) # 将符合condition的元素赋值为x 不符合赋值为y
print(b)
输出:
[[ 0 0 0]
[ 0 10 10]
[10 10 10]]