我有一个关于我在这里发布的后续问题。在那个问题中,我试图根据多个条件对一个 numpy 结构化数组中的值求和,包括列表中的匹配项。@ali_m 成功回答了这个问题:
criteriaList = ("Zone1", "Zone2")
myArray = np.array([(1, 1, 1, u'Zone3', 9.223),
(2, 1, 0, u'Zone2', 17.589),
(3, 1, 1, u'Zone2', 26.95),
(4, 0, 1, u'Zone1', 19.367),
(5, 1, 1, u'Zone1', 4.395)],
dtype=[('ID', '<i4'), ('Flag1', '<i4'), ('Flag2', '<i4'), ('ZoneName', '<U5'),
('Value', '<f8')])
result = myArray[(myArray["Flag1"] == 1) & (myArray["Flag2"] == 1)
& np.in1d(myArray["ZoneName"], criteriaList)]["Value"].sum()
这将产生 31.345 的预期结果。
现在我想弄清楚如果我的数组中有下划线分隔的值如何修改它,并且如果与critieriaList 有部分匹配,我想在我的总和中包含该行。在以下 numpy 结构化数组中,第三行包含下划线分隔值。在这种情况下,我想包含该值,因为“Zone1”作为“ZoneName”值的一部分包含在内:
myArray = np.array([(1, 1, 1, u'Zone3', 9.223),
(2, 1, 0, u'Zone2', 17.589),
(3, 1, 1, u'Zone1_Zone3', 26.95),
(4, 0, 1, u'Zone1', 19.367),
(5, 1, 1, u'Zone1', 4.395)],
dtype=[('ID', '<i4'), ('Flag1', '<i4'), ('Flag2', '<i4'), ('ZoneName', '<U10'),
('Value', '<f8')])
我尝试拆分数组中的值:
str(myArray["ZoneName"]).split('_')
但是如果不打开循环并使用 if 语句,就无法弄清楚如何处理这些。任何帮助将不胜感激。谢谢。
这是一个可以使用循环和 if 语句来解决此问题的方法的示例。这不是书面的功能,但根据 hpualij 的评论概述了我的思考过程。(如果有“Zone14”,这也会导致问题,因为“Zone1”在“Zone14”中)
values = []
criteriaList = ("Zone1", "Zone2")
for criteria in criteriaList:
zones = myArray["ZoneName"]
for zone in zones:
if criteria in zone:
print ("criteria=" + criteria)
print ("zone=" + zone)
value = myArray[((myArray["Flag1"] == 1) & (myArray["Flag2"] == 1)
& (myArray["ZoneName"] == zone))]["Value"].sum
print(value)
result = sum(values)