簡體   English   中英

Numpy:獲取索引大於值且條件為真的數組

[英]Numpy: get array where index greater than value and condition is true

我有以下數組:

a = np.array([6,5,4,3,4,5,6])

現在我想獲取所有大於 4 但索引值也大於 2 的元素。我發現這樣做的方法如下:

a[2:][a[2:]>4]

有沒有更好或更易讀的方法來實現這一點?

更新:這是一個簡化版本。 實際上,索引是通過對幾個變量的算術運算完成的,如下所示:

a[len(trainPredict)+(look_back*2)+1:][a[len(trainPredict)+(look_back*2)+1:]>4]

trainPredict是一個 numpy 數組, look_back是一個 integer。
我想看看是否有既定的方式或其他人如何做到這一點。

如果您擔心切片的復雜性和/或條件的數量,您可以隨時將它們分開:

a = np.array([6,5,4,3,4,5,6])

a_slice = a[2:]

cond_1 = a_slice > 4

res = a_slice[cond_1]

您的示例是否非常簡化? 對於更復雜的操作,可能有更好的解決方案。

@AlexanderCécile 的答案不僅比您發布的那條更易讀,而且還消除了臨時數組的冗余計算。 盡管如此,它似乎並不比您原來的方法快。

下面的時間都是在初步設置下運行的

import numpy as np
np.random.seed(0xDEADBEEF)
a = np.random.randint(8, size=N)

N從 1e3 到 1e8 變化為 10 倍。我嘗試了四種代碼變體:

  1. CodePope: result = a[2:][a[2:] > 4]
  2. AlexanderCécile: s = a[2:]; result = s[s > 4] s = a[2:]; result = s[s > 4]
  3. MadPhysicist1: result = a[np.flatnonzero(a[2:]) + 2]
  4. MadPhysicist2: result = a[(a > 4) & (np.arange(a.size) >= 2)]

在所有情況下,時間都是在命令行上通過運行獲得的

python -m timeit -s 'import numpy as np; np.random.seed(0xDEADBEEF); a = np.random.randint(8, size=N)' '<X>'

這里, N是 3 和 8 之間的 10 的冪,而<X>是上述表達式之一。 時間安排如下:

在此處輸入圖像描述

方法#1 和#2 幾乎無法區分。 令人驚訝的是,在 ~5e3 和 ~1e6 元素之間的范圍內,方法#3 似乎稍微慢一些,但明顯更快。 我通常不會從花哨的索引中期望這一點。 方法#4 當然是最慢的。

為了完整起見,這里是數據:

           CodePope  AlexanderCécile  MadPhysicist1  MadPhysicist2
1000       3.77e-06         3.69e-06       5.48e-06       6.52e-06
10000       4.6e-05         4.59e-05       3.97e-05       5.93e-05
100000     0.000484         0.000483         0.0004       0.000592
1000000     0.00513          0.00515        0.00503        0.00675
10000000     0.0529           0.0525         0.0617          0.102
100000000     0.657            0.658          0.782           1.09

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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