Векторная матрица списка Python десятичные 0s 1s - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть список в Python

l=[[0.1,0.2,0.9],[0.3,0.4,0.6],[0.8,0.2,0.8]]

если element <=0.5, вернуть 0, если element > 0.5, вернуть 1

Следовательно, в результате l должно выглядеть так:

l=[[0,0,1],[0,0,1],[1,0,1]]

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Есть несколько способов сделать это; либо в чистом Python с помощью понимания списка, либо в векторизации с использованием сторонней библиотеки.

Чистый Питон

Вы можете использовать понимание вложенного списка.

l = [[0.1,0.2,0.9],[0.3,0.4,0.6],[0.8,0.2,0.8]]

res = [[0 if i <= 0.5 else 1 for i in row] for row in l]

[[0, 0, 1], [0, 0, 1], [1, 0, 1]]

Векторизованная альтернатива

Используется сторонняя библиотека numpy.

import numpy as np

res = np.where(np.array(l) <= 0.5, 0, 1)

array([[0, 0, 1],
       [0, 0, 1],
       [1, 0, 1]])

Примечание по округлению

Сравнение чисел с плавающей запятой затруднено из-за характера float , а не хранения числовых данных в формате base-10. См. Не работает ли математика с плавающей запятой? для более подробной информации. Это проблема даже с вышеуказанными методами.

Это означает, что вам, возможно, придется позаботиться о пограничных случаях, если это важно для вас.

0 голосов
/ 28 апреля 2018

Выезд round.

>>> l=[[0.1,0.2,0.9],[0.3,0.4,0.6],[0.8,0.2,0.8]]
>>> [[round(x) for x in i] for i in l]
[[0, 0, 1], [0, 0, 1], [1, 0, 1]]

Как упомянуто @iAdjunct в комментариях и обсуждено в этом вопросе, при работе на python 2 это не приведет к желаемому результату.

Это потому, что они используют разные методы округления. Разницу можно проиллюстрировать следующими примерами:

python2:

>>> round(0.5)
1.0

Python3

>>> round(0.5)
0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...