numpy如何按條件給元素賦值np.where、np.clip
numpy按條件給元素賦值np.where、np.clip
np.where(condition, [x, y])
屬于numpy的元素選擇函數(shù)
Parameters:
- condition:條件,是一個類array的bool數(shù)組。個人根絕是一個bool mask。
- x,y:類array數(shù)組。當(dāng)condition是True時返回x,為False時返回y。x與必須同時給出或者同時不給出,不能只給出一個。當(dāng)都不給出時,依據(jù)nonzero返回處理。
Returns:
1、當(dāng)只給出condition時,返回一個tuple,該tuple就是滿足condition的元素的index。tuple元素的個數(shù)是原來array的維度,一維一個元素,二維兩個元素。每個元素對應(yīng)位置數(shù)據(jù)組合起來就是滿足condition的元素的index。
2、給出x和y,返回一個和condition相同形狀的數(shù)組。這里x與y的shape很重要,而且由condition的shape決定。當(dāng)condition是(k,m,n)時,x與y 的shape依賴condition的維度。
x,y的shape如下如圖:

當(dāng)滿足條件時,會根據(jù)x和y的維度取替換condition上的對應(yīng)值。
使用舉例1:
arr = np.arange(12).reshape(3,4)
arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
np.where(arr > 6)
(array([1, 2, 2, 2, 2], dtype=int64), array([3, 0, 1, 2, 3], dtype=int64))返回一個tuple,兩個元素,因為arr的shape是(3,4)是二維的。第一個元素是行,第二個元素是列。第一個滿足條件的元素的第1行第3列的元素,即元素7。
使用舉例2:
np.where(arr > 6, 0, arr)
array([[0, 1, 2, 3],
[4, 5, 6, 0],
[0, 0, 0, 0]])滿足條件的替換為0,不滿足的返回arr中的值。從arr取值時是按照索引取選取的。這里要注意,當(dāng)x或y的維度小于condition的維度時,忽略高維度的索引,比如忽略k,只根據(jù)m和n的值從x或y取數(shù)。
個人理解就一句話:用同一個維度(粒度)上的數(shù)據(jù)取替換同一個維度(粒度)上的數(shù)據(jù)。
實際操作中使用較多的還是用(k,m,n)原數(shù)組或者常數(shù)替換操作,即替換原來數(shù)組中的某些值。
np.clip(a, a_min, a_max, out=None)
Params:
a_min, a_max:整數(shù)、類array數(shù)組或者None,下面逐一解讀。
- 整數(shù)時,將小于a_min的值替換為a_min。然后,將大于a_max的值替換為a_max。處于兩者之間數(shù)保持不變。
- 類array時,當(dāng)a的形狀是(m,n),a_min、a_max是(m,1)、(m,)或者是(m,n)。通俗講,要么給a中每一個一維數(shù)組中每一個元素提供一個比較值,要么給a中每個一維數(shù)組提供一個統(tǒng)計的比較值,要么提供一個與一維數(shù)組形狀形同的數(shù)組,然后廣播。擴展到3維也是一樣的道理。
- None,當(dāng)a_min為None時,表示小于amax的值保留原值。當(dāng)a_max為None時,表示大于amin的值保留原值。 a_min和a_max只能有一個是None。
Returns:
返回一個與傳入數(shù)組形狀相同的數(shù)組。
舉例:
arr
array([[ 7, -3, 12],
[14, 0, 8]])給二維數(shù)組中每一個數(shù)組傳入一個統(tǒng)一的比較值
b
array([[1],
[2]])
np.clip(arr,b,None)
array([[ 7, 1, 12],
[14, 2, 8]])傳入一個和一維數(shù)組相同形狀的數(shù)組,然后沿著軸0廣播。
b
array([1, 4, 9])
np.clip(arr,b,arr)
array([[ 7, 4, 12],
[14, 4, 9]])Numpy.where()/np.where() 函數(shù)的使用
修改數(shù)組中符合條件的元素值/查找數(shù)組中符合要求的元素的位置
numpy.where() 用法
1. np.where(condition, x, y):用于修改滿足條件的元素值
用法解釋:滿足condition將數(shù)組元素修改為x,否則修改為y,最后生成一個新的數(shù)組。
注意:np.where不會修改原數(shù)組的數(shù)值,而會生成一個新的數(shù)組
- 1.1 一維數(shù)組
# 生成-5到4的一維數(shù)組
arr1 = np.arange(-5,5)
print('原數(shù)組 ? ? ? ? ? :',arr1)
arr2 = np.where(arr1>0,1,-1)
print('查看原數(shù)組是否修改:',arr1)
print('修改后的數(shù)組 ? ? ?:',arr2)輸出結(jié)果:
原數(shù)組 : [-5 -4 -3 -2 -1 0 1 2 3 4]
查看原數(shù)組是否修改: [-5 -4 -3 -2 -1 0 1 2 3 4]
修改后的數(shù)組 : [-1 -1 -1 -1 -1 -1 1 1 1 1]
如果只對一個條件進行修改:>0 保持不變,小于0變?yōu)?1
將where語句修改為如下即可:
arr2 = np.where(arr1>0,arr1,-1)
即,不修改的位置為arr原數(shù)組的值
- 1.2 二維數(shù)組
arr1 = np.arange(-5,5).reshape(2,5)
print('原數(shù)組',arr1,sep='\n')
arr2 = np.where(arr1>0,1,-1)
print('修改后的數(shù)組',arr2,sep='\n')輸出結(jié)果:
原數(shù)組
[[-5 -4 -3 -2 -1]
[ 0 1 2 3 4]]
修改后的數(shù)組
[[-1 -1 -1 -1 -1]
[-1 1 1 1 1]]
2 np.where(condition): 用于找出滿足條件的元素位置(坐標(biāo))
- 2.1 一維數(shù)組
# 生成-5到4的一維數(shù)組 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),)
上述結(jié)果說明:arr1 > 0的元素所在的位置是[6,7,8,9]
并且arr2是個元組的類型,其中包含著數(shù)組類型的位置坐標(biāo)。
print(type(arr2)) print(type(arr2[0])) ------------------------- 結(jié)果: <class 'tuple'> <class 'numpy.ndarray'>
2.1.1利用生成的元素進行索引數(shù)據(jù):
- 法1直接利用元組索引,比較方便
- 法2利用數(shù)組進行索引
# 索引法1 print(arr1[arr2]) # 索引法2 print(arr1[arr2[0]])
2.1.2 不滿足條件的情況
# 不滿足條件 arr1 = np.arange(-5,5) arr3 = np.where(arr1 < -5) print(arr3) print(arr1[arr3]) -------------------------------- 結(jié)果: (array([], dtype=int64),) []
2.2.1判斷滿足的條件的元素個數(shù)
利用數(shù)組的.size屬性很好判斷
arr1 = np.arange(-5,5) arr2 = np.where(arr1 > 0) arr3 = np.where(arr1 < -5) print(arr2[0].size) print(arr3[0].size) ------------------------------------ 結(jié)果: 4 0
- 2.2二維數(shù)組
二維數(shù)組與一維數(shù)組類似,但是返回的元組中有兩個數(shù)組:分別表示行的索引和列的索引
arr1 = np.arange(0,10).reshape(2,5) print(arr1) arr2 = np.where(arr1>3) print(arr2)
結(jié)果:
[[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))
從結(jié)果中我們可以看到,元組中的第一個數(shù)組表示的是行的索引,第二個數(shù)組是列的索引
所以滿足>3的元素位置是:[0,4],[1,0],…
索引方法類似
# 索引 arr1[arr2] ----------- array([4, 5, 6, 7, 8, 9])
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python報表自動化之從數(shù)據(jù)到可視化一站式指南
在現(xiàn)代數(shù)據(jù)驅(qū)動的世界中,生成清晰、有用的報表對于業(yè)務(wù)決策至關(guān)重要,Python作為一門強大的編程語言,提供了豐富的庫和工具,使得報表自動化變得輕而易舉,本文將詳細介紹如何利用Python從數(shù)據(jù)處理到可視化,實現(xiàn)報表自動化的全過程2024-01-01
Django Celery異步任務(wù)隊列的實現(xiàn)
這篇文章主要介紹了Django Celery異步任務(wù)隊列的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
pytorch實現(xiàn)保證每次運行使用的隨機數(shù)都相同
今天小編就為大家分享一篇pytorch實現(xiàn)保證每次運行使用的隨機數(shù)都相同,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02
pycharm社區(qū)版安裝django并創(chuàng)建一個簡單項目的全過程
社區(qū)版的pycharm跟專業(yè)版的pycharm應(yīng)用差別還是不太大,下面這篇文章主要給大家介紹了關(guān)于pycharm社區(qū)版安裝django并創(chuàng)建一個簡單項目的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-05-05
python使用Windows的wmic命令監(jiān)控文件運行狀況,如有異常發(fā)送郵件報警
這篇文章主要介紹了python使用Windows的wmic命令監(jiān)控文件運行狀況,如有異常發(fā)送郵件報警的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01

