2017-06-03 94 views
2

我有一個NumPy數組有兩個維度,所以第一個數組是從1到50和第二個50到150的數字:如何訪問具有不同維度的多維NumPy數組的特定行?

a =numpy.array([[1,2,3,...,50],[50,51,52...,150]])

我想的

print(a[1,:])方式打印例如第二行指定行,

得到[50,51,52...,150]但它顯示

print((a[1,:])) 
IndexError: too many indices for array 

錯誤。當我將第二行減少到與第一行相同數量的元素時,它起作用。所以,問題是打印具有不同尺寸的指定行。如果可能,請告訴我如何處理這個問題?謝謝!

+0

打印出'a.shape'。我懷疑這是一個1維的對象數組。甚至看起來陣列的長度是不同的。 – piRSquared

回答

0

在同一個矩陣的不同行中有不同數量的元素是沒有意義的。要解決您的問題,最好首先用0或NA填充所有行中缺少的元素,以便所有行中的元素數相等。

也請看Numpy: Fix array with rows of different lengths by filling the empty elements with zeros的答案。我正在實施您的問題中提到的最佳解決方案之一。

import numpy as np 
def numpy_fillna(data): 

    lens = np.array([len(i) for i in data]) 
    mask = np.arange(lens.max()) < lens[:,None] 

    out = np.zeros(mask.shape, dtype=data.dtype) 
    out[mask] = np.concatenate(data) 
    return out 

a =np.array([range(1,50),range(50,150)]) 
data=numpy_fillna(a) 

print data[1,:] 
+0

非常好的解釋,謝謝@Pankaj –

2

擁有不同數量的兩個部分元素,你沒有得到一個二維數組:

In [15]: a1=list(range(1,6)) 
In [16]: a2=list(range(5,16)) 
In [17]: a=np.array([a1,a2]) 
In [18]: a 
Out[18]: array([[1, 2, 3, 4, 5], [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]], dtype=object) 
In [19]: a[1] 
Out[19]: [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 
In [20]: a.shape 
Out[20]: (2,) 

注意dtype。這是對象。 a是一個2元素數組,包含2個列表。這是,對於大多數的目的只是你的兩個原始列表的列表,並在以同樣的方式被編入索引:

In [21]: [a1,a2] 
Out[21]: [[1, 2, 3, 4, 5], [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]] 

如果兩個組件具有相同的長度,則np.array並構建一個二維數組。

當您遇到類似問題時,請檢查shapedtype。假設這些屬性是危險的。打印出來。並且要注意與numpy混合不同長度的列表或數組。它適用於符合整齊規則多維結構的數據。

+0

是的,我明白了,非常感謝@hpaulj –