# numpy.where怎么用
`numpy.where`是NumPy庫中用于條件篩選和數組操作的強大函數。它能夠根據指定條件返回數組中滿足條件的元素索引,或進行條件替換操作。本文將詳細介紹`numpy.where`的語法、常見用法和實際應用場景。
## 一、基本語法
```python
numpy.where(condition[, x, y])
參數說明:
- condition
:布爾型數組或條件表達式
- x
(可選):當條件為True時選取的值
- y
(可選):當條件為False時選取的值
返回值: - 如果只提供condition,返回滿足條件的元素索引(元組形式) - 如果提供x和y,返回與condition同形狀的數組
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
indices = np.where(arr > 3)
print(indices) # 輸出:(array([3, 4], dtype=int64),)
對于多維數組:
arr_2d = np.array([[1, 2], [3, 4]])
rows, cols = np.where(arr_2d > 2)
print(rows) # 輸出:[1 1]
print(cols) # 輸出:[0 1]
arr = np.array([1, 2, 3, 4, 5])
result = np.where(arr > 3, '符合', '不符合')
print(result)
# 輸出:['不符合' '不符合' '不符合' '符合' '符合']
arr = np.random.randn(10) # 生成10個隨機數
result = np.where((arr > 0.5) | (arr < -0.5), '極端值', '正常值')
print(result)
# 將數組中的NaN值替換為0
data = np.array([1, np.nan, 3, np.nan, 5])
cleaned = np.where(np.isnan(data), 0, data)
print(cleaned) # 輸出:[1. 0. 3. 0. 5.]
# 二值化處理:大于閾值的設為255,小于的設為0
image = np.random.randint(0, 256, (100, 100)) # 模擬灰度圖像
threshold = 128
binary = np.where(image > threshold, 255, 0)
# 對正數取平方根,負數取絕對值
values = np.array([-4, -1, 0, 1, 4])
processed = np.where(values > 0, np.sqrt(values), np.abs(values))
print(processed) # 輸出:[4. 1. 0. 1. 2.]
# 不推薦寫法(y會被提前計算)
result = np.where(condition, expensive_func1(), expensive_func2())
# 推薦寫法(使用lambda延遲計算)
result = np.where(condition, lambda: expensive_func1(), lambda: expensive_func2())
# 比循環或列表推導式快得多
arr = np.random.rand(1000000)
%timeit np.where(arr > 0.5)
arr_2d = np.random.randn(3, 3)
# 找出每行最大值的位置
max_indices = np.where(arr_2d == arr_2d.max(axis=1, keepdims=True))
布爾索引返回的是滿足條件的元素值,而np.where(condition)
返回的是索引位置:
arr = np.array([1, 2, 3, 4])
bool_arr = arr > 2
print(arr[bool_arr]) # 輸出:[3 4]
print(np.where(bool_arr)) # 輸出:(array([2, 3], dtype=int64),)
使用位運算符組合條件:
condition = (arr > 2) & (arr < 5) # 必須使用括號
condition = (arr < 0) | (arr > 10) # 或條件
因為NumPy需要支持多維數組,每個維度對應元組中的一個數組:
arr_2d = np.array([[1, 2], [3, 4]])
print(np.where(arr_2d > 2)) # 輸出:(array([1, 1], dtype=int64), array([0, 1], dtype=int64))
conditions = [arr < 0, (arr >= 0) & (arr < 5), arr >= 5]
choices = ['負值', '小正值', '大正值']
result = np.select(conditions, choices)
# 根據另一數組生成條件
arr1 = np.array([1, 2, 3])
arr2 = np.array([3, 2, 1])
result = np.where(arr1 > arr2, arr1, arr2)
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df['C'] = np.where(df['A'] > 1, 'Y', 'N')
numpy.where
是處理條件邏輯的核心函數,掌握它可以:
1. 高效地進行數組條件篩選
2. 實現向量化的條件替換
3. 避免Python循環帶來的性能損失
記住關鍵點: - 僅傳入condition時返回索引 - 傳入x,y時實現條件替換 - 條件表達式支持廣播機制 - 性能優于Python原生條件判斷
通過本文的示例和解釋,您應該已經掌握了numpy.where
的核心用法。在實際數據分析和科學計算中,靈活運用這個函數可以顯著提高代碼效率和可讀性。
“`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。