2014-09-03 20 views
7

Aralıklar verildiğinde, bir dizi diziyi bir dizi ve sıfırlar haline dönüştürmek mümkün müdür? yani [2,3] -> [0, 0, 1, 1, 0], 5Bir dizin dizisini Numpy'deki bir maske dizisine nasıl dönüştürebilirsiniz?

aralığında böyle bir şey otomatikleştirmek çalışıyorum:

>>> index_array = np.arange(200,300) 
array([200, 201, ... , 299]) 

>>> mask_array = ???   # some function of index_array and 500 
array([0, 0, 0, ..., 1, 1, 1, ... , 0, 0, 0]) 

>>> train(data[mask_array]) # trains with 200~299 
>>> predict(data[~mask_array]) # predicts with 0~199, 300~499 
+0

scipy'nin maskeli bir dizi modülü var. Bu soru ile ilgilidir. http://docs.scipy.org/doc/numpy/reference/maskedarray.html –

+0

'[x aralığında (500) için indeks_dizisi] türünde bir sıralama var, ancak' True' ve 'False' yerine 1 ve 0 – genisage

+0

@genisage Yorumunuzu cevap olarak sunabilir misiniz? Ben seninkini seçmek istiyorum. Aradığım tam şey bu. Cevap için teşekkür ederim! – Efreeto

cevap

15

İşte bir yolu şudur:

In [1]: index_array = np.array([3, 4, 7, 9]) 

In [2]: n = 15 

In [3]: mask_array = np.zeros(n, dtype=int) 

In [4]: mask_array[index_array] = 1 

In [5]: mask_array 
Out[5]: array([0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0]) 

maske bir dizi her zaman ise, index_array ortadan kaldırmak ve bir dilim için 1 atayabilirsiniz:

In [6]: mask_array = np.zeros(n, dtype=int) 

In [7]: mask_array[5:10] = 1 

In [8]: mask_array 
Out[8]: array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]) 
yerine tamsayılar boole değer dizisi isterseniz o oluşturulduğunda 10

, mask_array ait dtype değiştirin: İstendiği gibi

In [11]: mask_array = np.zeros(n, dtype=bool) 

In [12]: mask_array 
Out[12]: 
array([False, False, False, False, False, False, False, False, False, 
     False, False, False, False, False, False], dtype=bool) 

In [13]: mask_array[5:10] = True 

In [14]: mask_array 
Out[14]: 
array([False, False, False, False, False, True, True, True, True, 
     True, False, False, False, False, False], dtype=bool) 
+0

+1 Bu özellikle de birisinin mask_dizisinin bir np.array olmasını istemesi durumunda çok hoş bir cevap. – Efreeto

+0

Ve bu liste kavramadan çok daha verimlidir. – JulienD

+0

Bool yerine int kullanmanın bir avantajı var mı? Sadece bir soru sorduğunda, sorunun üst kısmının neden bool önermediğini merak ediyorum. – Annan

-1

, işte burada bir cevap var. Kod: İstediğin gibi

[x in index_array for x in range(500)] 

size bir maske verecektir, ancak bool değerlerden oluşan yerine 0 ve 1'leri kullanacaktır.

+0

Lütfen onu reddetme. Cevabını yorum yapmasını istedim. Ve kabul edilen cevabı değiştireceğim, böylece bu cevap inkar edilemez. – Efreeto

2

tek bir boyut için, deneyin: Birden fazla boyut için

n = (15,) 
index_array = [2, 5, 7] 
mask_array = numpy.zeros(n) 
mask_array[index_array] = 1 

, tek boyutlu olanları içine n boyutlu indeksleri dönüştürmek, daha sonra kullanmak ravel:

n = (15, 15) 
index_array = [[1, 4, 6], [10, 11, 2]] # you may need to transpose your indices! 
mask_array = numpy.zeros(n) 
flat_index_array = np.ravel_multi_index(
    index_array, 
    mask_array.shape) 
numpy.ravel(mask_array)[flat_index_array] = 1 
0

güzel var Bunu bir tek liner olarak yapmak için de hile - numpy.in1d ve numpy.arange işlevlerini kullanın (son satır anahtar parçasıdır):

>>> x = np.linspace(-2, 2, 10) 
>>> y = x**2 - 1 
>>> idxs = np.where(y<0) 

>>> np.in1d(np.arange(len(x)), idxs) 
array([False, False, False, True, True, True, True, False, False, False], dtype=bool) 

Bu yaklaşımın dezavantajı, Warren Weckesser'in verdiği uygulamadan yaklaşık 10-100 kat daha yavaş olmasıdır ... ama bu sizin aradığınız şey olabilir veya olmayabilir.

İlgili konular