我有兩個numpy數組a,b,其維數爲m乘n。我有一個長度爲n的布爾向量b,我想生成一個新的數組c,它從a,b中選擇n個列,這樣如果b [i]爲真,我從b取出列,否則從a取出列。我如何以最有效的方式做到這一點。我看過select
,where
和choose
。基於布爾向量在numpy中選擇列
回答
首先,讓我們設置了一些示例代碼:
import numpy as np
m, n = 5, 3
a = np.zeros((m, n))
b = np.ones((m, n))
boolvec = np.random.randint(0, 2, m).astype(bool)
只是爲了顯示這個數據可能是什麼樣子:
In [2]: a
Out[2]:
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
In [3]: b
Out[3]:
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
In [4]: boolvec
Out[4]: array([ True, True, False, False, False], dtype=bool)
在這種情況下,這是最有效的使用np.where
此。但是,我們需要boolvec
的形狀可以播放與a
和b
相同的形狀。因此,我們可以通過與np.newaxis
或None
切片(它們是相同的),使之成爲列向量:
In [5]: boolvec[:,None]
Out[5]:
array([[ True],
[ True],
[False],
[False],
[False]], dtype=bool)
,然後我們可以使用做了np.where
最終結果:
In [6]: c = np.where(boolvec[:, None], a, b)
In [7]: c
Out[7]:
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
謝謝, 'where'比'choose'更快。我不需要使用'np。新聞廣播似乎有效? –
@NeilG - 這取決於「boolvec」是「m」長度還是「n」長度。 'np.where'假定與「正常」索引相比略有不同。如果長度爲「m」,則可以使用「boolvec」進行索引,但是「np.where」預計它會廣播,這沿着最後一個軸應用。因此,如果'boolvec'是'm'-長度的,你需要用'np.newaxis'進行切片,如果它是'長'的,你不會(或者說,你可以,但是, d do'boolvec [None,:]')。 –
另外,我剛剛意識到我誤解了你原來的問題。你在問一個'n'長度的矢量,在這種情況下'np.where'按原樣運行。 –
你可以爲此使用np.choose
。
例如a
和b
數組:
>>> a = np.arange(12).reshape(3,4)
>>> b = np.arange(12).reshape(3,4) + 100
>>> a_and_b = np.array([a, b])
要使用np.choose
,我們希望與兩個陣列一個三維陣列; a_and_b
看起來是這樣的:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[100, 101, 102, 103],
[104, 105, 106, 107],
[108, 109, 110, 111]]])
現在讓布爾數組是bl = np.array([0, 1, 1, 0])
。然後:
>>> np.choose(bl, a_and_b)
array([[ 0, 101, 102, 3],
[ 4, 105, 106, 7],
[ 8, 109, 110, 11]])
計時爲(5000,3000)陣列是:
In [107]: timeit np.where(boolvec[:,None],b,a)
1 loops, best of 3: 993 ms per loop
In [108]: timeit np.choose(boolvec[:,None],[a,b])
1 loops, best of 3: 929 ms per loop
In [109]: timeit c=a[:];c[boolvec,:]=b[boolvec,:]
1 loops, best of 3: 786 ms per loop
where
和choose
基本上是相同的;布爾索引稍快。 select
使用choose
,所以我沒有時間。
我給列採樣定時是相似的,不同的是這次索引較慢:
In [119]: timeit np.where(cols,b,a)
1 loops, best of 3: 878 ms per loop
In [120]: timeit np.choose(cols,[a,b])
1 loops, best of 3: 915 ms per loop
In [121]: timeit c=a[:];c[:,cols]=b[:,cols]
1 loops, best of 3: 1.25 s per loop
校正,對於索引我應該使用a.copy()
。
In [32]: timeit c=a.copy();c[boolvec,:]=b[boolvec,:]
1 loops, best of 3: 783 ms per loop
In [33]: timeit c=a.copy();c[:,cols]=b[:,cols]
1 loops, best of 3: 1.44 s per loop
我得到Python2.7和3,numpy的1.8.2和1.9.0開發中相同的定時
在我的電腦上選擇速度是原來的兩倍。不知道爲什麼。 –
- 1. 在numpy的2D陣列中選擇行用布爾矢量
- 2. ChoiceField - 基於布爾字段的選擇
- 3. 列表的布爾選擇
- 4. 基於二進制向量選擇矩陣的列
- 5. Knockout.js布爾選擇列表選項
- 6. 請選擇一個基於發佈請求的選擇列表
- 7. 布爾變量基於對象屬性
- 8. 構建基於布爾變量
- 9. 基於布爾變量的條件c#
- 10. init讓變量基於布爾值
- 11. 在Python中使用布爾條件向量選擇numpy子數組的簡單方法3
- 12. 基於2 LINQ列表中選擇1個對象瓦爾
- 13. ManyToMany模型字段的選擇更改基於布爾值
- 14. 如何調理我的選擇基於布爾參數
- 15. 中選擇列*不是在向量
- 16. 從numpy recarray中選擇列
- 17. 在LINQ to SQL中選擇基於變量的列
- 18. 選擇基於列的值
- 19. MySQL的 - 選擇基於列
- 20. 選擇基於另一列
- 21. SQL選擇布爾選項
- 22. 在numpy中有效的矢量選擇
- 23. 選擇虛擬布爾列SQL/Access
- 24. 布爾在numpy的總和
- 25. 在SQL CE選擇語句中的反向布爾(位)值
- 26. 帶有布爾語句的Numpy向量化函數分配
- 27. SUM基於布爾範圍
- 28. 轉換行向量列向量與NumPy
- 29. 如何根據一維布爾掩模選擇numpy矩陣的列?
- 30. MySQL的選擇,其中列基於IF
你能否提供一些樣品(虛擬)的數據和預期的輸出?我知道你已經很清楚地解釋了它,但它確實幫助其他人(我真的)在視覺上更好地理解你的問題 – Anzel
請忘記我說的話,其他人只是如此善於理解並已經提供解決方案:) – Anzel