2016-08-28 24 views
2

我想索引testdata只是等於2和3的標籤。但是,當我運行此代碼時,它將從2D(100 x 100)轉換成3D(100×1×100)。切片添加第三個維度到我的陣列 - 不知道爲什麼

任何人都可以解釋爲什麼它這樣做?代碼中的最後一行是罪魁禍首,但我不確定它爲什麼會發生。

labels = testdata[:,0] 
num2 = numpy.nonzero(labels == 2) 
num2 = numpy.transpose(num2) 
num3 = numpy.nonzero(labels == 3) 
num3 = numpy.transpose(num3) 
num = numpy.vstack([num2,num3]) 
testdata = testdata[num,:] 
+1

您說最後一行是罪魁禍首,但你沒有向我們展示'ind'是什麼。你的意思是把'num'放在那裏?如果你能包含完整的代碼,我們可以通過簡單地將其從問題中複製出來,這是最好的。 –

+0

我認爲這裏的邏輯被破壞了:你應該已經將'numpy.nonzero'調用的結果分配給'indN',而不是'numN'。 – ForceBru

+0

您可以創建一個[mcve]嗎?在我們可以幫助您解決問題之前,瞭解這些陣列的形狀非常重要... – Praveen

回答

1

當有拼圖時,打印中間值。更好的是,在交互式shell中運行測試用例,以便檢查每個值,並瞭解發生了什麼。跟蹤形狀。

貌似labels是數字的一維數組,如:

In [212]: labels=np.array([0,1,2,2,3,2,0,3,2]) 

指標,其中labels是2或3:

In [213]: num2=np.nonzero(labels==2) 
In [214]: num2 
Out[214]: (array([2, 3, 5, 8], dtype=int32),) 
In [215]: num3=np.nonzero(labels==3) 

這裏有一個關鍵步驟 - 什麼是transpose目的。請注意0​​是一個具有一個1d陣列的元組。

In [216]: num2=np.transpose(num2) 
In [217]: num3=np.transpose(num3) 
In [218]: num2 
Out[218]: 
array([[2], 
     [3], 
     [5], 
     [8]], dtype=int32) 

轉置num2之後是一個列陣列,(4,1)的形狀。

連接它們垂直地產生一個(6,1)陣列:

In [220]: num=np.vstack([num2,num3]) 
In [221]: num 
Out[221]: 
array([[2], 
     [3], 
     [5], 
     [8], 
     [4], 
     [7]], dtype=int32) 
In [222]: num.shape 
Out[222]: (6, 1) 
In [223]: labels[num] 
Out[223]: 
array([[2], 
     [2], 
     [2], 
     [2], 
     [3], 
     [3]]) 
In [224]: labels[num].shape 
Out[224]: (6, 1) 

索引與該陣列的一維陣列產生相同的形狀索引的另一個陣列。索引x[num,:]做同樣的事情,但增加了最後一個維度。


如果我索引(3,4)陣列與所述第一尺寸的(2,5)排列,其結果是一個(2,5,4)陣列:

In [227]: np.ones((3,4))[np.ones((2,5),int),:].shape 
Out[227]: (2, 5, 4) 
相關問題