Numpy маска по строкам - PullRequest
1 голос
/ 13 июля 2020

У меня есть 2D-массив:

matrix =np.array([[95,90,-1,55],[100,90,-1,80],[0,90,85,100]])

Я пытаюсь выбрать 2 случайные строки и игнорировать -1.

Я пробовал:

random_ints = np.random.choice(len(matrix), size=2, replace=False)
students = matrix[random_ints, :]
ignored = students[students != -1]

но игнорируемый var преобразован в массив 1D, например:

[95,90,55,100,90,80]

Я хочу, чтобы проигнорированные сохраненные 2D, например:

[[95,90,55],[100,90,80]]

Как это сделать?

1 Ответ

0 голосов
/ 14 июля 2020

Если бы у вас было равно количество элементов, которые нужно оставить (! = -1 ) в каждой строке, вы могли бы запустить:

np.apply_along_axis(lambda row: row[row != -1], 1, students)

Чтобы проверить в этом варианте установите random_ints = np.array([0,1]), выберите только указанные выше строки для студентов и запустите указанный выше код.

Но если количество этих элементов отличается , Numpy вызовет исключение:

ValueError: could not broadcast input array from shape (3) into shape (4)

Причина в том, что (в данном случае) в некоторых строках осталось 4 элементов, а в других - только 3 .

К сожалению, Numpy не поддерживает «зубчатые» массивы (с разным количеством элементов в каждой строке).

Можно получите что-то вроде , которое вы хотели, но в виде вложенного списка (не массива Numpy):

result = []
for row in students:
    result.append(row[row != -1].tolist())

Результат ( для строк 2 и 1 ) это:

[[0, 90, 85, 100], [100, 90, 80]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...