2015-10-15 21 views
1

我想用numpy.where我陣列的記錄:的Python numpy.where和結構化(記錄)陣列

new_array = np.core.records.fromrecords([(data[0],data[1],data[2],data[3],data[4],data[5],ND‌​ate)],names='Date, Name, Age, Start, End,Avg,NDate',formats='S10,d,d,d,d,d,d') 

我已經試過這樣:

np.where(work.stock==6.26) 
>>(array([], dtype=int32),) 

返回任何,所以我試過這個:

np.where(work.stock==work.stock[6.26]) 
>>(array([6]),) 

返回相等元素的個數。但我只需要第一次出現的索引。如何做呢?

+0

你在尋找'numpy.argwhere'嗎?我真的不知道... – mgilson

+0

嗯,我不知道。我剛剛嘗試np.argwhere替換np.where,但它返回相同的結果。我需要第一個出現的索引 – Riggun

回答

0

從您的第一條語句我可以構建一個看起來很像陣列

new_array = np.core.records.fromrecords([(1,2,3,4,5,6,7)], 
    names='Date, Name, Age, Start, End,Avg,NDate', 
    formats='S10,d,d,d,d,d,d') 

其顯示爲

rec.array([('1', 2.0, 3.0, 4.0, 5.0, 6.0, 7.0)], 
    dtype=[('Date', 'S10'), ('Name', '<f8'), ('Age', '<f8'), 
    ('Start', '<f8'), ('End', '<f8'), ('Avg', '<f8'), ('NDate', '<f8')]) 

但你

np.where(work.stock == 6.26)

讓我撓撓腦袋。什麼是workstock是另一個數組的字段。這不是new_array的字段。

np.where(work.stock == work.stock [6.26])

同樣令人費解。你怎樣用一個浮點數(6.26)來索引一個數組?

小心做像work.stock==6.26這樣的測試。由於舍入誤差,浮標上的平等測試通常不起作用。

在簡單陣列上練習np.where。在嘗試浮動之前從整數開始。瞭解它在沒有任何匹配時以及有多個匹配時產生的內容。

如果您的new_array中只有一條記錄,那麼使用簡單的Python列表可能會更好。


這裏是你如何可以使用where找到第一個記錄與給定值在某一特定領域具有

定義一小陣有2場,4條記錄,和整數值(便於測試) :是等於1(整數)的X['f0']

In [482]: X=np.core.records.fromrecords([(1,2),(2,3),(3,3),(4,1),(1,2)],dtype='i,i') 

In [483]: X 
Out[483]: 
rec.array([(1, 2), (2, 3), (3, 3), (4, 1), (1, 2)], 
     dtype=[('f0', '<i4'), ('f1', '<i4')]) 

In [484]: X['f0'] 
Out[484]: array([1, 2, 3, 4, 1]) 

元素

In [486]: i=np.where(X['f0']==1) 

In [487]: i 
Out[487]: (array([0, 4]),) 

而第一個的索引(第一[0]採陣列出來的元組)

In [488]: i[0][0] 
Out[488]: 0 

In [489]: X[i[0][0]] 
Out[489]: (1, 2) 

我也可以使用整個i得到所有滿足此條件的X

In [494]: X[i] 
Out[494]: 
rec.array([(1, 2), (1, 2)], 
     dtype=[('f0', '<i4'), ('f1', '<i4')]) 

,並選擇第一:

In [495]: X[i][0] 
Out[495]: (1, 2) 

如果沒有任何匹配,然後where返回一個空數組

In [496]: i=np.where(X['f0']==5) 

In [497]: X[i] 
Out[497]: 
rec.array([], 
     dtype=[('f0', '<i4'), ('f1', '<i4')]) 

在結構化陣列字段甲where試驗比在2D陣列的行或列中的測試確實沒有什麼不同。


我改變X.f0X['f0'],因爲該記錄數組表示法可以是混亂,和非記錄結構化陣列是更常見的,這些天,特別是當通過np.getfromtxt產生陣列。

X==2返回FalseX['f0']==2返回array([False, True, False, False, False], dtype=bool)。布爾測試不適用於結構化數組的字段。

要在所有字段中找到'行'X,我必須針對匹配的結構化數組進行測試,例如,

In [507]: X==np.array([(2,3)],dtype=X.dtype) 
Out[507]: rec.array([False, True, False, False, False], dtype=bool) 

np.where可以與Out[507]布爾數組工作。


查找X記錄,其中一個領域或其他有2

In [518]: I=(X['f0']==2) | (X['f1']==2) 

In [519]: I 
Out[519]: array([ True, True, False, False, True], dtype=bool) 

In [520]: X[I] 
Out[520]: 
rec.array([(1, 2), (2, 3), (1, 2)], 
     dtype=[('f0', '<i4'), ('f1', '<i4')]) 

我必須單獨測試每一個領域。

在這種情況下,X所有字段都是整數,所以可以構建一個2D整數視圖,以及執行上一個測試:

In [526]: np.any(X.view(int).reshape(X.shape[0],-1)==2,axis=1) 
Out[526]: array([ True, True, False, False, True], dtype=bool) 

查看最近https://stackoverflow.com/a/33094425/901925更多上使用結構化的view陣列。

+0

對不起,我錯過了說new_array是類「工作」的一部分,所以正確的調用應該是np.where(work.new_array == work.new_array [6.26])。是的,我嘗試過使用where函數進行練習,即使使用浮動項目,它也能正常工作,但我使用了與您一樣的簡單數組。但不能弄清楚如何將它與結構化數組結合使用 – Riggun

+0

例如,我知道在new_array的Start列中存在值6.26。所以如果我通過np.where調用它(work.stock ['Start'] == 6.26)它給了我(數組([27]),) - 它是正確的6.26值被分配給索引27.但是我想一次搜索所有數組,意味着所有字段一次不會被字段 – Riggun

+0

試圖搜索整數值。我有一個整數字段,但沒有運氣相同的結果 – Riggun