问题:如何按照指定条件去对numpy ndarray 的部分值作修改?
1、面对这个问题首先想到的是去挨个遍历数组中的每个元素:
比如对于一个二维数组:
1. shape = arr.shape 2. result = np.zeros(shape) 3. for x in range(0, shape[0]): 4. for y in range(0, shape[1]): 5. if arr[x, y] >= T: 6. result[x, y] = 255
但这种方式显然无法有效的对更高维度的数组操作,而且速度很慢。如果数据维度不是很重要的话,比如只需要统计出数组中大于0的值的个数,此时可以使用ndarray.flatten函数将多维数组折叠成一维数组再做操作....
2、python的优点就是它的库函数丰富,numpy 提供的numpy.where()函数就可以很好地解决这一问题:
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)]
1. >>> aa = np.arange(10) 2. #函数说明:arange([start,] stop[, step,], dtype=None)根据start与stop指定的范围以及step设定的步 3. #长,生成一个 ndarray。比如np.arange(3)>>>array([0, 1, 2]) 4. >>> np.where(aa,1,-1) 5. array([-1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) # 0为False,所以第一个输出-1 6. >>> np.where(aa > 5,1,-1) 7. array([-1, -1, -1, -1, -1, -1, 1, 1, 1, 1]) 8. 9. >>> np.where([[True,False], [True,True]], # 官网上的例子 10. [[1,2], [3,4]], 11. [[9,8], [7,6]]) 12. array([[1, 8], 13. [3, 4]])
(2) np.where(condition)
只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标 (等价于numpy.nonzero)。这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。
1. >>> a = np.array([2,4,6,8,10]) 2. >>> np.where(a > 5) # 返回索引 3. (array([2, 3, 4]),) 4. >>> a[np.where(a > 5)] # 等价于 a[a>5] 5. array([ 6, 8, 10]) 6. 7. >>> np.where([[0, 1], [1, 0]]) 8. (array([0, 1]), array([1, 0])) 9. #[[0,1],[1,0]]的真值为两个1,各自的第一维坐标为[0,1],第二维坐标为[1,0]
3、使用numpy内置索引,十分方便,而且因为numpy在算法上内部做了优化,速度也不差
ndarray:arr
,则可以使用:arr[arr > 255] = x----将所有元素>255
替换为值x
补充:numpy的内置索引机制:NumPy之四:高级索引和索引技巧
文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树科学计算基础软件包NumPyNumPy概述220433 人正在系统学习中
AIEarth是一个由众多领域内专家博主共同打造的学术平台,旨在建设一个拥抱智慧未来的学术殿堂!【平台地址:https://devpress.csdn.net/aiearth】 很高兴认识你!加入我们共同进步!