從您的第一條語句我可以構建一個看起來很像陣列
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)
讓我撓撓腦袋。什麼是work
? stock
是另一個數組的字段。這不是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.f0
到X['f0']
,因爲該記錄數組表示法可以是混亂,和非記錄結構化陣列是更常見的,這些天,特別是當通過np.getfromtxt
產生陣列。
X==2
返回False
。 X['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
陣列。
你在尋找'numpy.argwhere'嗎?我真的不知道... – mgilson
嗯,我不知道。我剛剛嘗試np.argwhere替換np.where,但它返回相同的結果。我需要第一個出現的索引 – Riggun