2016-04-04 35 views
0

Python numpy paketinde, bir ndarray'ın 2. boyutun boş olduğu durumu anlamakta sorun yaşıyorum. İşte bir örnek:Python numpy dizisinde boş boyut nasıl anlaşılır?

In[1]: d2 = np.random.rand(10) 
    In[2]: d2.shape = (-1, 1) 

    In[3]: print d2.shape 
    In[4]: print(d2) 

    In[5]: print d2[::2, 0].shape 
    In[6]: print d2[::2, 0] 

    Out[3]:(10, 1) 
    Out[4]: 
[[ 0.12362278] 
[ 0.26365227] 
[ 0.33939172] 
[ 0.91501369] 
[ 0.97008342] 
[ 0.95294087] 
[ 0.38906367] 
[ 0.1] 
[ 0.67842086] 
[ 0.23711077]] 

    Out[5]: (5,) 
    Out[6]: [ 0.12362278 0.33939172 0.97008342 0.38906367 0.67842086] 

Anladığım kadarıyla d2, 1 sütun ndarray ile 10 satırdır. Out [6] açıkça 1 ile 5 arasında bir dizi, boyutları nasıl olabilir (5,)? Boş 2. boyut ne anlama geliyor?

+3

' (5) 'sadece bir girişle bir demet stringifying Python'un yoludur. – jojonas

+0

"Dışarı [6] açıkça 1 dizisi 5 dizidir" - Hayır, bu dizide "1 by" yoktur. Tek boyutu 5 uzunluğa sahip olan 1 boyutludur. – user2357112

cevap

3

Size önemli bir farkı gösteren bir örnek vereyim.

d1 = np.array([1,2,3,4,5]) # array([1, 2, 3, 4, 5]) 
d1.shape -> (5,) # row array.  
d1.size -> 5 
d1.T is the same as d1. 

d2 = d1[np.newaxis] # array([[1, 2, 3, 4, 5]]). Note extra [] 
d2.shape -> (1,5) 
d2.size -> 5 
d2.T will give a column array 
array([[1], 
     [2], 
     [3], 
     [4], 
     [5]]) 
d2.T.shape -> (5,1) 
+0

Örnek için teşekkür ederiz! yardımcı olur –

0

Burada anlaşılması gereken en önemli şey, bir tam sayı ile dizinlemenin bir dilim ile dizinlemeden farklı olmasıdır. Örneğin, bir 1d dizisini veya bir tamsayı içeren bir listeyi indekslediğinizde, bir skaler alırsınız ancak bir dilim ile indekslediğinizde, sırasıyla bir dizi veya liste alırsınız. Aynı şey 2d + dizileri için de geçerlidir. Yani, örneğin:

# Make a 3d array: 
import numpy as np 
array = np.arange(60).reshape((3, 4, 5)) 

# Indexing with ints gives a scalar 
print array[2, 3, 4] == 59 
# True 

# Indexing with slices gives a 3d array 
print array[:2, :2, :2].shape 
# (2, 2, 2) 

# Indexing with a mix of slices and ints will give an array with < 3 dims 
print array[0, :2, :3].shape 
# (2, 3) 
print array[:, 2, 0:1].shape 
# (3, 1) 

bazen onun büyük vektörlerin topluluğu olarak bir dizi düşünmek çünkü bir şekilde uzayda N noktalarını temsil edebilir örneğin Bu, kavramsal olarak gerçekten yararlı olabilir (N, 3) dizi : (5) `belirsiz (ya da daha doğrusu sadece` 5`) olurdu `çünkü

n_points = np.random.random([10, 3]) 
point_2 = n_points[2] 
print all(point_2 == n_points[2, :]) 
# True