2017-05-31 28 views
0

所以這裏的交易:我有變量x這是一個numpy.ndarray。這個結構的大小是1000.如果我做x[0],那麼我得到一個numpy.void,4個數字。如果我做x[1],然後我得到另一個numpy.void,也是4號等如何切片由numpy.void數字組成的numpy.ndarray?

我只是想做的事:我想切片這種數據結構,讓我提取numpy的矩陣,大小1000x3的。

我該怎麼做?由於

回答

2

聽起來像是你有一個結構化的陣列,像這樣簡單的例子:

In [158]: x = np.ones((5,), dtype='i,i,f,f') 
In [159]: x 
Out[159]: 
array([(1, 1, 1., 1.), (1, 1, 1., 1.), (1, 1, 1., 1.), 
     (1, 1, 1., 1.), (1, 1, 1., 1.)], 
     dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4'), ('f3', '<f4')]) 
In [160]: x[0] 
Out[160]: (1, 1, 1., 1.) 
In [161]: type(x[0]) 
Out[161]: numpy.void 

x[0]是一個記錄,顯示爲一個元組。您可以通過名稱訪問字段(不是「列」指數):

In [162]: x['f0'] 
Out[162]: array([1, 1, 1, 1, 1], dtype=int32) 
In [163]: x['f2'] = np.arange(5) 

In [165]: x['f1'] = [10,12,8,0,3] 
In [166]: x 
Out[166]: 
array([(1, 10, 0., 1.), (1, 12, 1., 1.), (1, 8, 2., 1.), 
     (1, 0, 3., 1.), (1, 3, 4., 1.)], 
     dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<f4'), ('f3', '<f4')]) 
In [168]: x[['f2','f3']] # 2 fields at once 
Out[168]: 
array([(0., 1.), (1., 1.), (2., 1.), (3., 1.), (4., 1.)], 
     dtype=[('f2', '<f4'), ('f3', '<f4')]) 

這是非常方便的時候「列」應包含不同的東西,比如字符串之一,另一個整數。但將這樣的數組轉換爲相同數值類型的二維數組可能會很尷尬。

viewastype在有限的情況下工作,但tolist是我知道的最強大的轉換媒介。

In [179]: x.tolist() 
Out[179]: 
[(1, 10, 0.0, 1.0), 
(1, 12, 1.0, 1.0), 
(1, 8, 2.0, 1.0), 
(1, 0, 3.0, 1.0), 
(1, 3, 4.0, 1.0)] 
In [180]: np.array(x.tolist()) 
Out[180]: 
array([[ 1., 10., 0., 1.], 
     [ 1., 12., 1., 1.], 
     [ 1., 8., 2., 1.], 
     [ 1., 0., 3., 1.], 
     [ 1., 3., 4., 1.]]) 

注意,tolist用於結構化陣列是元組的列表,而對tolist 2D陣列是一個列表的列表。朝着這個方向發展,差異並不重要。換個角度看,差異很重要。

你是如何生成這個數組的?從csvgenfromtxt?作爲一些其他數字包的輸出?

+0

耶穌基督。這正是我需要的。非常感謝!!我沒有生成它,我遞給它。 :)如果我有能力生成它,我認爲我不會以這種方式纏繞它。 – Spacey