Фильтровать структурированный массив numpy на основе нескольких значений

У меня есть многоуровневый структурированный массив. :

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

Я хотел бы суммировать значения из столбца «Значение», когда выполняются несколько критериев. Если я хочу, чтобы Flag1 и Flag2 == ==, я могу использовать:

 sumResult = (sum(myArray[((myArray["Flag1"] == 1) & (myArray["Flag2"] == 1))]["Value"])) 

Тем не менее, я также хотел бы включить третий критерий, основанный на том, являются ли значения в списке, что эквивалентно использованию x in list :

 criteriaList = ("Zone1", "Zone2") sumResult = (sum(myArray[((myArray["Flag1"] == 1) & (myArray["Flag2"] == 1) & (myArray["ZoneName"] in criteriaList))]["Value"])) 

Который должен равняться 31.345. Я новичок в numpy и изучил маскированные массивы, но неясно, как и как их можно использовать со структурированными массивами. Благодарю.

Вам нужно использовать np.in1d для проверки членства в вашем criteriaList np.in1d :

 In [1]: myArray["ZoneName"] in criteriaList --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-1-ff2173ff4348> in <module>() ----> 1 myArray["ZoneName"] in criteriaList ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() In [2]: np.in1d(myArray["ZoneName"], criteriaList) Out[2]: array([False, True, True, True, True], dtype=bool) In [3]: myArray[(myArray["Flag1"] == 1) & ....: (myArray["Flag2"] == 1) & ....: np.in1d(myArray["ZoneName"], criteriaList)]["Value"].sum() Out[3]: 31.344999999999999