2015-10-15 28 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