假设我有一个numpy数组,如下所示:数组的形状是(5,3),有超过100万行,类型为numpy对象。
样品阵列:
x = np.array([['A',1,10],['B',1,20],['C',2,80],['D',3,40],['E',2,50]])
我希望实现以下目标:
如果列Y的值存在于另一行中,但仅存在于整个数组集中的列Y中,则检查列X的值,并且它们不相等,然后过滤记录。
Col X Y Z
[['A' '1' '10'] ---> filter value '1' from the all values of column Y in entire array
['B' '1' '20'] ---> filter value '1' from the all values of column Y in entire array
['C' '2' '80'] ---> filter value '2' from the all values of column Y in entire array
['D' '3' '40'] ---> filter value '3' from the all values of column Y in entire array
['E' '2' '50']] ---> filter value '2' from the all values of column Y in entire array
例如:当检查行号1时,列y值为 *'1',对于同一行,列x值为 *'A'。因此,第一个过滤器基于列y值“1”;下面的行满足条件。
[['A' '1' '10']
*['B' '1'* '20']]
然后根据第1行中列x的值应用第二个过滤器,该值不等于所有其他过滤行列x的值。
所以在这种情况下,行2满足这两个条件。['B' '1'* '20']]
注意:本例显示了两条匹配的记录,但实际上,它可以是一条或多条,并且可以位于任何行位置。
接下来,我想执行的是,对于选定的记录(在本例中为第2行),追加到第1行。
请建议
我试过这段代码,但没有舔:
import numpy as np
x = np.array([['A',1,10],['B',1,20],['C',2,80],['D',3,40],['E',2,50]])
y = x
print(x)
print("Result is:",x[np.where(x[:,1] == y[:,1], np.where(x[:,0] != y[:,0][::-1]),False)])
x= --->print(x)
[['A' '1' '10']
['B' '1' '20']
['C' '2' '80']
['D' '3' '40']
['E' '2' '50']]
结果为:空
2条答案
按热度按时间qlfbtfca1#
你的预期结果真的是这样吗?:
如果是这样,您可以执行以下操作:
然后使用掩码,每行
True
值的索引对应于expected_indexes
。从这里我看不出你如何在没有for循环的情况下工作,但是繁重的工作已经完成了,你再也没有结构化数组了:
xwbd5t1u2#
你的答案嵌套了两个
np.where
,真正起作用的是np.where(x[:,0] != y[:,0][::-1])
,它返回x的索引,其中列Y相同,但列X不相等。你要做的就是把索引发送给x。