1. np.where(condition, x, y):用于修改满足条件的元素值
用法解释:满足condition将数组元素修改为x,否则修改为y,最后生成一个新的数组。
注意:np.where不会修改原数组的数值,而会生成一个新的数组
# 生成-5到4的一维数组
arr1 = np.arange(-5,5)
print('原数组 :',arr1)
arr2 = np.where(arr1>0,1,-1)
print('查看原数组是否修改:',arr1)
print('修改后的数组 :',arr2)
输出结果:
原数组 : [-5 -4 -3 -2 -1 0 1 2 3 4]
查看原数组是否修改: [-5 -4 -3 -2 -1 0 1 2 3 4]
修改后的数组 : [-1 -1 -1 -1 -1 -1 1 1 1 1]
如果只对一个条件进行修改:>0 保持不变,小于0变为-1
将where语句修改为如下即可:
arr2 = np.where(arr1>0,arr1,-1)
即,不修改的位置为arr原数组的值
arr1 = np.arange(-5,5).reshape(2,5)
print('原数组',arr1,sep='\n')
arr2 = np.where(arr1>0,1,-1)
print('修改后的数组',arr2,sep='\n')
输出结果:
原数组
[[-5 -4 -3 -2 -1]
[ 0 1 2 3 4]]
修改后的数组
[[-1 -1 -1 -1 -1]
[-1 1 1 1 1]]
2 np.where(condition): 用于找出满足条件的元素位置(坐标)
# 生成-5到4的一维数组
arr1 = np.arange(-5,5)
print(arr1)
arr2 = np.where(arr1>0)
print(arr2)
[-5 -4 -3 -2 -1 0 1 2 3 4]
(array([6, 7, 8, 9], dtype=int64),)
上述结果说明:arr1 > 0的元素所在的位置是[6,7,8,9]
并且arr2是个元组的类型,其中包含着数组类型的位置坐标。
print(type(arr2))
print(type(arr2[0]))
-------------------------
结果:
<class 'tuple'>
<class 'numpy.ndarray'>
法1直接利用元组索引,比较方便
法2利用数组进行索引
# 索引法1
print(arr1[arr2])
# 索引法2
print(arr1[arr2[0]])
# 不满足条件
arr1 = np.arange(-5,5)
arr3 = np.where(arr1 < -5)
print(arr3)
print(arr1[arr3])
--------------------------------
结果:
(array([], dtype=int64),)
[]
利用数组的.size属性很好判断
arr1 = np.arange(-5,5)
arr2 = np.where(arr1 > 0)
arr3 = np.where(arr1 < -5)
print(arr2[0].size)
print(arr3[0].size)
------------------------------------
结果:
4
0
二维数组与一维数组类似,但是返回的元组中有两个数组:分别表示行的索引和列的索引
arr1 = np.arange(0,10).reshape(2,5)
print(arr1)
arr2 = np.where(arr1>3)
print(arr2)
结果:
[[0 1 2 3 4]
[5 6 7 8 9]]
(array([0, 1, 1, 1, 1, 1], dtype=int64), array([4, 0, 1, 2, 3, 4], dtype=int64))
从结果中我们可以看到,元组中的第一个数组表示的是行的索引,第二个数组是列的索引
所以满足>3的元素位置是:[0,4],[1,0],…
索引方法类似
# 索引
arr1[arr2]
-----------
array([4, 5, 6, 7, 8, 9])
numpy的where方法
numpy.where的用法