簡體   English   中英

將整數乘以布爾值並理解 numpy 數組比較

[英]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 類型,其中FalseTrue分別轉換為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM