Numpy ndarray – как выбрать строку на основе значений для нескольких столбцов

У меня есть ndarray компонентов x и y значений 2D-скорости объекта, например:

(Pdb) p highspeedentries
array([[  0.  ,  52.57],
   [-40.58,  70.89],
   [-57.32,  76.47],
   [-57.92,  65.1 ],
   [-52.47,  96.68],
   [-45.58,  77.12],
   [-37.83,  69.52]])

(Pdb) p type(highspeedentries)
<class 'numpy.ndarray'>

Я должен проверить, есть ли какая-либо строка, содержащая значение выше 55 для первого и второго компонентов в строке. Мне также нужно взять абсолютное значение для любого отрицательного компонента скорости, но сначала я попробовал следующее, и все они дают ошибки.

(Pdb) p highspeedentries[highspeedentries[:,1] > 55 and highspeedentries[0,:] > 55]
*** ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

(Pdb) p highspeedentries[highspeedentries[:,1] > 55 & highspeedentries[0,:] > 55]
*** TypeError: ufunc 'bitwise_and' not supported for the input types, and the inputs could not be 
safely coerced to any supported types according to the casting rule ''safe''

(Pdb) p highspeedentries[np.logical_and(highspeedentries[:,1] > 55, highspeedentries[0,:] > 55)]
*** ValueError: operands could not be broadcast together with shapes (7,) (2,)

person Tania    schedule 14.11.2019    source источник
comment
highspeedentries[0,:] > 55 заменить на highspeedentries[:,0] > 55   -  person bubble    schedule 14.11.2019


Ответы (1)


Один глупый способ приблизиться к этому - просто перебрать весь массив в поисках вашего состояния:

for i in highspeedentries:
    if (abs(i[0]) > 55 and abs(i[1]) > 55):
        print('True')
        break
else:
    print('False')

С другой стороны, вы были на правильном пути для третьей попытки:

logical_and(abs(highspeedentries[:, 0]) > 55 , abs(highspeedentries[:, 1]) > 55).any()

Порядок индексов был неправильным, и если вы добавите .any() в конец, вы получите одно значение (True, если хотя бы один элемент имеет значение True, False в противном случае) вместо логического массива. Чтобы применить абсолютное значение, вы можете просто применить abs() к массивам перед сравнением с 55.

person 10762409 says Reinstate Monica    schedule 14.11.2019