2012-06-11 33 views
7

Aslında bir dizelerin listesini temsil eden bir 2B numpy char dizilimim var (bir NetCDF4 dosyasından). Onu bir dizi listeye dönüştürmek istiyorum.Dizgiye göre karakter dizisi dizisi

ben bir dizeye karakter bitiştirmek için() katılmak kullanabilirsiniz biliyorum ama sadece bu süre içinde bir dize yapmak için bir yol bulabilirsiniz:

data = np.array([['a','b'],['c','d']]) 
for row in data[:]: 
    print ''.join(row) 

Ama çok yavaş. Tek bir komut dizisindeki dizeleri nasıl döndürebilirim?

>> s = [''.join(row) for row in data] 
>> s 
['ab', 'cd'] 

sadece for döngü yeniden yazıldı geçerli: Teşekkür

+3

Neden "veri" for döngüsünüzde kopyalanıyorsunuz? –

cevap

3

bir liste anlama deneyin.

+1

+1. Bir başka alternatif ise haritadır (''. Join, data). –

+0

@DavidRobinson Bunu düşünmemiştim - çok güzel. – Chris

+0

harika cevaplar. çok teşekkürler! – AdrianR

11

Liste kavraması en "pythonic" yoldur.

en "numpythonic" yol olacağını:

>>> data = np.array([['a','b'],['c','d']]) 
# a 2D view 
>>> data.view('S2') 
array([['ab'], 
     ['cd']], 
     dtype='|S2') 
# or maybe a 1D view ...fastest solution: 
>>> data.view('S2').ravel() 
array(['ab', 'cd'], 
     dtype='|S2') 

Tekrar olmayacak, hiçbir liste anlama, hatta bir kopyası. Tampon sadece orada farklı bir "görüş" ile değişmeden oturur, bu yüzden bu en hızlı çözümdür.

+1

Önemli bir uyarı, dizinin bellekte * bitişik * olması gerektiğidir - aksi halde görünüm başarısız olur. Bunu, 'data = np.ascontiguousarray (data)' kullanarak sağlayabilirsiniz. – shoyer