2016-04-09 38 views
-1

göre benbölme numpy dizi bool

a = np.array[ 4, 9, 3, 1, 6, 4, 7, 4, 2]

gibi bir dizi ve

boo = np.array[ True, True, False, False, True, True, True, False, True]

gibi aynı büyüklükte bir Boole dizisi (böylece olan bir maske) (boo başlatabilir False ile ilk girişte ...)

Şimdi bölmek istiyorum 012 Yeni diziler içine2 ile koşulları:

  • yeni bir alt dizisi boo
  • yeni bir alt dizisi bir False sonra hep başlar ve False önce biter de True tek değerleri içerir. Ben temel olarak np.split kullanabileceğinizi biliyor
    :
    Yani sonuç [[4, 9], [6, 4, 7], [2]]

Benim fikir olurdu.
Bu durumda b = np.split(a, [2, 4, 7, 8] olur ve daha sonra b dan sadece ikinci ikinci öğeyi alırdım, ilk öğeden başlayarak boo ilk öğemim True olur.

Sorunum: [2, 4, 7, 8] dizisini nasıl alabilirim?

(. Çok yavaş çünkü piton ile döngü, bir seçenek değildir)

cevap

1

Belki bu yeterince hızlı olduğunu:

indices = np.nonzero(boo[1:] != boo[:-1])[0] + 1 
b = np.split(a, indices) 
b = b[0::2] if boo[0] else b[1::2] 
:

d = np.nonzero(boo != np.roll(boo, 1))[0] 
if d[0] == 0: 
    d = d[1:] 
b = np.split(a, d) 
b = b[0::2] if boo[0] else b[1::2] 

daha basit ve daha hızlı bir şekilde bulundu

Dilimlerin karşılaştırılması, en az iki kez np.roll() kadar hızlıdır ve if ifadesidir.
Ayrıca, np.flatnonzero(...)np.nonzero(...)[0]'dan daha güzel görünecektir, ancak biraz daha yavaş olun.

İlgili konular