从您的第一条语句我可以构建一个看起来很像阵列
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