2010-12-30 16 views
15

Her iki dizenin ve sayısal değerlerin sütunlarını getiren numpy.genfromtxt kullanarak bir dosyada okuyorum. Yapmam gereken bir şey girişin uzunluğunu tespit etmektir. Her bir dizide okunan birden fazla değerin bulunması koşuluyla, her şey yolunda.Yalnızca bir öğe ile bir numpy dizisinin uzunluğunu nasıl algılar?

Ancak, sonuçta oluşan dizide yalnızca bir öğe varsa, mantık başarısız olur. Burada bir örnek yeniden oluşturabilirsiniz:

import numpy as np 
a = np.array(2.3) 

len (a) belirten bir hata döndürür: 2 veya daha fazla eleman, len() varsa bir beklendiği gibi

TypeError: len() of unsized object 

ancak davranır.

import numpy as np 
a = np.array([2.3,3.6]) 

len (a) bazı garip durum işleme kullanırsanız, bir varlık boş ve bir uzunluğunda olan ayırt edemez, is burada 2

Benim endişe döndürür = 1.

EDIT: @noskio, a = np.array ([2.3]) ayarını önerdi. Sorun şu ki, a'nın gerçek oluşumu numpy.genfromtxt kullanarakdır. Kod şöyle görünür: Sonuç olarak

import numpy as np 
indata = np.genfromtxt(some_filename, names=True,dtype=None) 
a = indata['one_col_headername'] 

, InData dosyasında yalnızca bir satır ise, bir 0-d dizidir.

+1

'dizisi ([2])' bir eleman ve 1 boyuta sahip bir dizidir . dizi (2), sıfır dereceli veya sıfır boyutlara sahip bir dizidir. – endolith

cevap

32

(cevabı varsayarsak bekliyoruz 1): Bu Numpy 0 boyutlu diziler uygulamaya karar neden

In [1]: import numpy as np 

In [2]: a = np.array(2.3) 

In [3]: len(np.atleast_1d(a)) 
Out[3]: 1 

This page açıklıyor.

+1

Teşekkürler @pberkes! Bu ton yardımcı olur ve sorunu çözer – mishaF

+0

Bağlantı bozuk :( – wim

+2

@wim bağlantı kaldırılmış gibi görünüyor ve bunun için bir yedek bulamıyorum. – pberkes

0
a = np.array([2.3]) 
print len(a) 
+0

Bu, gösterdiğiniz gibi bir sabit için çalışır, ancak – ecoe

6
import numpy as np 

tests=[np.array(2.3),np.array([]),np.array([2.3]),np.array([2.3,3.6])] 

print('{a:30}{s:<10}{l:<10}{sl:<10}'.format(a='repr',s='shape',sl='len(shape)',l='length')) 
for a in tests: 
    s=a.shape 
    l=len(a) if a.shape else 0 
    sl=len(s) 
    print('{a!r:30}{s:<10}{l:<10}{sl:<10}'.format(a=a,l=l,s=s,sl=sl)) 

verimleri

repr       shape  length len(shape) 
array(2.2999999999999998) ()  0   0   
array([], dtype=float64)  (0,)  0   1   
array([ 2.3])     (1,)  1   1   
array([ 2.3, 3.6])   (2,)  2   1   

Bir "boş" bir dizi (örneğin, np.array([])) ve belirlenmiş biçimin uzunluğuna bakarak numpy skalar (örneğin np.array(2.3)) arasındaki farkı ayırabilmektedir. Eğer tek astar gerekiyorsa

+0

dizesi @unubtu dizisi girişi için değil. Bu harika, ama 1 ile boş bir a arasındaki farkı nasıl ayırt edebilirim? – mishaF

+0

Anladım! Bu ton yardımcı olur. – mishaF

3

Dizinin tek boyutlu olduğunu biliyorsanız, bu durumda size ndarrays özelliği çalışır gibi görünüyor. Benim düşünceme göre, a.size, len(np.atleast_1d(a))'dan çok daha okunabilir. Bununla birlikte, birden fazla boyuta sahipse size özellik dizisinde elemanların toplam sayı döndürür dikkat:

In [1]: import numpy as np 

In [2]: np.array(2.3).size 
Out[2]: 1 

In [3]: np.array([1, 2]).size 
Out[3]: 2 

In [4]: np.array([[1,2], [3,4]]).size 
Out[4]: 4 
İlgili konular