Python numpy.where和结构化(记录)数组

时间:2015-10-15 02:00:03

标签: python arrays numpy

我想在我的记录数组中使用numpy.where:

tinyMCE.get('content').getContent()

我试过这个:

[plugin]---GET THIS CODE----[/plugin]

什么也没有回复,所以我尝试了这个:

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')

返回相等元素的数量。但我只需要第一次出现的指数。怎么办呢?

1 个答案:

答案 0 :(得分: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])

同样令人费解。如何使用float(6.26)索引数组?

小心做work.stock==6.26之类的测试。由于舍入误差,浮点数的平等测试通常不起作用。

在简单数组上使用np.where练习。在尝试浮动之前从整数开始。了解当没有任何匹配时,以及有多个匹配时产生的内容。

如果new_array中只有一条记录,那么使用简单的Python列表可能会更好。

以下是使用where查找指定字段中给定值的第一条记录的方法

定义一个包含2个字段,4个记录和整数值的小数组(为了便于测试):

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])

X['f0']的元素等于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生成时。 / p>

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)

有关使用view结构化数组的详情,请参阅最近的https://stackoverflow.com/a/33094425/901925