標籤:

Python-Numpy模塊where函數

1.前言

如果學習過編程語言話,一定知道一個叫做"三目運算符"(三元表達式)的東西,一般來說我們可以把他看成是一個簡單的"if - - else"語句。下面是在java中的三目表達式(其實在大多數的語言中都是這樣的):

單目運算符: ~3(位運算符取反碼)

雙目運算符:3 + 4

三目運算符:

格式:比較(關係)表達式?表達式1:表達式2;

比較表達式:結果是一個boolean類型。

執行流程:

根據比較(關係)表達式的計算返回一個ture或者false。

如果是true,就把表達式1作為結果。

如果是false,就把表達式2作為結果。

那為什麼要提一下別的語言中的三目表達式呢?因為Python沒有使用這種通用格式來實現三目表達式,這裡需要注意一下:

為真時的結果 if 判定條件 else 為假時的結果

那我插一句,看看他們有什麼區別呢?我們知道在java中"三目運算符"他是對"if--else"語句的一個簡化,如果能用"三目運算符"實現的一定能用"if--else"語句來實現,那麼他們就沒有一點區別嗎?由於"三目運算符"是一個運算符,所以他必須返回的是一個結果而不是輸出,但是"if--else"他的結果可以是一個輸出。但是我覺得雖然可以叫"三目運算符"或者"三元表達式",但是我覺的在Python中他僅僅能稱為"三元表達式",因為他的結果可以是一個輸出,而且單單看我們的Python中實現"三元表達式"語句,其實怎麼看就是一個"if--else"另一種表示形式。當然這僅僅是本人的理解。

print(4) if 2 < 4 else print(2)

2.numpy.where

前面說了那麼多關於三元表達式,就是為了引出我們的numpy.where,其實猜也能猜出來,我們的numpy.where正是我們的三元表達式x if condition else y的矢量化的版本。下面我們來看一下下面這個例子:

import numpy as npxarr = np.array([1.1,1.2,1.3,1.4,1.5])yarr = np.array([2.1,2.2,2.3,2.4,2.5])cond = np.array([True , False , True , True ,False])result = [(x if c else y) for x,y,c in zip(xarr,yarr,cond)]print(result)[1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]

有人會說這輸出結果是什麼鬼?看下面代碼:

xarr = [1.1,1.2,1.3,1.4,1.5]yarr = [2.1,2.2,2.3,2.4,2.5]cond = [True , False , True , True ,False]result = [(x if c else y) for x,y,c in zip(xarr,yarr,cond)]print(result)[1.1, 2.2, 1.3, 1.4, 2.5]

使用list存放數據的結果就比較好,其實這是因為他存放在數組中,進行了比較,那麼numpy數組就會放大我們的精度。我們知道numpy數組關注的是數值的計算,其實這個地方僅僅是精度的問題。

但是這個有幾個問題:

  1. 他對於大數組的處理速度不是很快(因為所有工作都是由純python完成的);
  2. 無法用於多維數組;

所以我們就有了numpy.where的出現:

import numpy as npxarr = np.array([1.1,1.2,1.3,1.4,1.5])yarr = np.array([2.1,2.2,2.3,2.4,2.5])cond = np.array([True , False , True , True ,False])result = np.where(cond,xarr,yarr)print(result)[ 1.1 2.2 1.3 1.4 2.5]

注意:

  1. 本例中雖然傳進的參數是數組類型,但是我們使用numpy並不僅僅局限於數組參數,所以where函數的參數可以是標量;
  2. 參數之間是有一定的對應關係的。

import numpy as nparray = np.where(True,[1,2,3],[4,5,8])#[True]也可以#這個地方傳進去的值是list,但是返回值還是數組#where會自動把參數轉換成numpy數組print(type(array))print(array)<class numpy.ndarray>[1 2 3]

import numpy as nparray = np.where([True,False],[1,2,3],[4,5,8])print(array)Traceback (most recent call last): File "G:/Python源碼/numpy_test/numpy_test.py", line 1439, in <module> array = np.where([True,False],[1,2,3],[4,5,8])ValueError: operands could not be broadcast together with shapes (2,) (3,) (3,)

推薦閱讀:

ImagePy開發文檔 —— 常用匯總
numpy和pandas入門
給深度學習入門者的Python快速教程 - numpy和Matplotlib篇
唯一化及集合邏輯
為什麼numpy的array那麼快?

TAG:Python | numpy |