![](/img/trans.png)
[英]Why does numpy array of booleans change to integers if concatenated with another array?
[英]Multiplying integers by booleans and understanding numpy array comparison
我正在編寫一個程序,其中有一個 numpy 數組a
,其元素可以采用三個可能的值:-1、0 或 1。我試圖將它的一些元素乘以一個數字c
。 我們的想法是獲得這種行為:
for i in range(len(a)):
if a[i] == b:
a[i] *= c
我想出了一個不需要任何循環的解決方案,它的工作速度比前一個快幾個數量級,這是我用來測試它們的代碼:
# Long array with random integers between -1 and 1
a = np.random.choice(3,1000000) - 1
a1 = a.copy()
a2 = a.copy()
# Reference values for b and c
b = 1
c = 10
# Solution with loop
t0 = time.time()
for i in range(len(a1)):
if a1[i] == b:
a1[i] *= c
t1 = time.time()
# Solution without loop
a2 = a2*((a2 == b)*c + (a2 != b))
t2 = time.time()
print("No loop: %f s"%(t1 - t0))
print("Loop: %f s"%(t2 - t1))
雖然它似乎工作正常,但我對將整數乘以布爾值並不滿意,但我不知道我是否應該這樣做,所以如果有人能告訴我更多關於 Numpy 正在做什么和/或如果我沒有考慮有更好的方法來做到這一點。
提前致謝!
NumPy 會將 bool 類型轉換為 integer 類型,其中False
和True
分別轉換為 0 和 1。 這個選角是安全的,所以不要擔心,要開心。
In [8]: np.can_cast(np.bool8, np.intc)
Out[8]: True
如果您更喜歡明確,您可以通過將(a2 == b)
替換為(a2 == b).astype(int)
來進行自己的轉換,但這不是必需的。
一些比較時間:
In [66]: %%timeit a2=a.copy()
...: a2*((a2==b)*10 + (a2!=b))
14.4 ms ± 36.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [67]: %%timeit a2=a.copy()
...: a2[a2==b] *= 10
1.96 ms ± 75 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [68]: %%timeit a2=a.copy()
...: a2[a2==b] = a2[a2==b]*10
3.28 ms ± 5.63 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [69]: %%timeit a2=a.copy()
...: np.multiply(a2, 10, where=a2==b, out=a2)
1.63 ms ± 3.38 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
最快的只做一個a2==b
測試。 與where
參數multiply
是最快的,但也有點難以理解。
並驗證最快的產生相同的東西:
In [73]: a2=a.copy();a2=a2*((a2==b)*10 + (a2!=b))
In [74]: a3=a.copy();np.multiply(a3, 10, where=a3==b, out=a3);
In [75]: np.allclose(a2,a3)
Out[75]: True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.