將條件邏輯作為陣列操作 where

2022-03-11 07:16:09 字數 1782 閱讀 1451

這一章就講解 numpy.where 函式。

他是三元表示式 的向量化版本。

三元表示式: x if condition else y

import numpy as np

xarr = 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])

在 cond 中的元素為 true 時,我們取 xarr 中對應的元素值,反之取 yarr 中的元素,可以通過列表推導式來完成,如下

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]

這樣會產生多個問題,首先如果陣列很大的話,速度會很慢,因為所有的工作都是通過直譯器解釋 python **完成的,其次,但陣列是多維時,就無法奏效了。而使用 np.where 時,就可以非常簡單的完成。

result = np.where(cond, xarr, yarr)

print(result)

結果[1.1, 2.2, 1.3, 1.4, 2.5]

where 的第二個和第三個引數並不需要是陣列,它們可以是標量。where在資料分析中的乙個典型用法是根據乙個陣列來生成乙個新的陣列。

比如:假設我有乙個隨機生成的正態分佈的矩陣資料,並且你想將其中的正數都變成2 ,所有負數都變成 -2 ,使用 where就很容易實現

arr = np.random.randn(4,4)

print(arr)

print('-----------')

print(np.where(arr>0, 2, -2))

print('---------')

print(np.where(arr > 0, 2 , arr))

結果[[-1.36253267 0.7440669 0.64946862 0.36891392]

[-0.01551911 0.01003852 2.32228195 -0.17199506]

[ 0.46897204 -0.15731851 -0.53239796 -0.56446061]

[-0.55566614 -0.27882886 -0.12773451 -0.15585518]]

-----------

[[-2 2 2 2]

[-2 2 2 -2]

[ 2 -2 -2 -2]

[-2 -2 -2 -2]]

---------

[[-1.36253267 2. 2. 2. ]

[-0.01551911 2. 2. -0.17199506]

[ 2. -0.15731851 -0.53239796 -0.56446061]

[-0.55566614 -0.27882886 -0.12773451 -0.15585518]]

正如看到的,第三個引數可以寫 原本的陣列,就相當於把小於0的元素用原本的陣列的對應位置的值對換,也就是說不做處理。

傳遞給 np.where 的陣列既可以是同等大小的陣列,也可以是標量

numpy學習筆記 將條件邏輯表述為陣列運算

numpy.where函式是三元表示式x if condition else y的向量化版本。假設我們有乙個布林陣列和兩個值陣列。xarr 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 tru...

條件,邏輯運算子

1.種類 優先順序6 高 優先順序7 低 2.結合方向 自左向右 3.優先級別 1 關係表示式 用關係運算子將兩個表示式連線起來的式子 2 關係表示式格式 表示式 關係運算子 表示式 3 關係表示式的值 1 表示關係成立,0 表示關係不成立 4.注意點 1 應避免對實數 小數 做相等或不等的判斷,應...

將陣列作為實參傳遞

在c 中我們應該少用指標,多用引用,原因請大家自行搜尋。在傳遞陣列的時候我們需要格外注意,先讓我們看乙個簡單的範例。passarray.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std template void func1...