Извлечение определенных столбцов в массиве NumPy по условию - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть домашнее задание для извлечения двумерного массива 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

Например, если:

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 rank, который будет справедлив для столбцов, которые я хочу, и для некоторых, как объединить их. Проблема в том, что он выводит массив 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 голосов
/ 04 апреля 2019

В Python выражение -0.4 < x_y_z[2] < 0.1 примерно эквивалентно -0.4 < x_y_z[2] and x_y_z[2] < 0.1. Оператор and определяет значение истинности каждой части выражения, преобразовывая его в логическое значение. В отличие от списков и кортежей Python, массивы numpy не поддерживают преобразование.

Правильный способ задания условия - битовая & (которая однозначна и не имеет короткого замыкания), а не неявная and (которая коротко замыкается и неоднозначна в этом случае):

condition = ((x_y_z[2, :] > - 0.4) & (x_y_z[2, :] < 0.1))

condition - логическая маска, которая выбирает нужные столбцы. Вы можете выбрать строки с простым срезом:

selection = x_y_z[:, condition] 
...