#python #python-3.x #numpy #numpy-ndarray
#python #python-3.x #numpy #numpy-ndarray
Вопрос:
У меня есть домашнее задание по извлечению двумерного массива numpy из другого двумерного np-массива путем выбора определенных столбцов по условию (не по диапазону).
Итак, у меня есть массив A
с формой (3, 50000)
. Я пытаюсь получить новый массив с формой (3, x)
для некоторого x < 50000 with the original columns of
A that satisfy the third cell in the column is
-0.4 < z < 0.1`.
Например, если:
A = [[1,2,3],[2,0.5,0],[9,-2,-0.2],[0,0,0.5]]
Я хочу вернуть:
B = [[2,0.5,0],[9,-2,-0.2]
Я попытался создать массив ранга bool 1, который имеет значение true для нужных мне столбцов, и каким-то образом объединить их. Проблема, с которой он выводится, — это массив 1 ранга, который не является тем, что я ищу. И я получил несколько ошибок ValueErrors..
bool_idx = (-0.4 < x_y_z[2] < 0.1)
Этот код вызвал некоторые проблемы:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Я могу сделать это с помощью нескольких циклов, но в NumPy так много прекрасных функций, что я уверен, что здесь чего-то не хватает..
Комментарии:
1. Можете ли вы поделиться тем, что вы пробовали?
2. Что бы я ни пробовал, мой метод возвращает массив 1 ранга.. Я пытался использовать x_y_z[bool_idx], когда bool_idx представляет собой массив 1 ранга с true в правильных столбцах и false в тех, которые мне не нужны .. но это так не сработает..
3. Не могли бы вы показать полный пример, который можно выполнить, пожалуйста?
4. Что вы подразумеваете под полностью выполняемым примером? То, что я показал с A и B, недостаточно ясно?
Ответ №1:
В Python выражение -0.4 < x_y_z[2] < 0.1
примерно эквивалентно -0.4 < x_y_z[2] and x_y_z[2] < 0.1
. and
Оператор определяет значение истинности каждой части выражения путем преобразования его в bool. В отличие от списков и кортежей Python, массивы numpy не поддерживают преобразование.
Правильный способ указать условие — побитовое amp;
(которое является однозначным и не допускающим короткого замыкания), а не неявное and
(которое в данном случае замыкает и неоднозначно):
condition = ((x_y_z[2, :] > - 0.4) amp; (x_y_z[2, :] < 0.1))
condition
это логическая маска, которая выбирает нужные столбцы. Вы можете выбрать строки с помощью простого фрагмента:
selection = x_y_z[:, condition]
Комментарии:
1. Да, это работает! Большое вам спасибо! Я не понимаю, в чем смысл [2, :] . Вторая строка в любом столбце?