2017-02-20 2 views
2

Учитывая это ДИКТ из numpy.ndarray:Python: Применение порога к Numpy массива

d={0: np.array([[ 9.81650352, 10.03896523, 10.26972675], [11.76386738, 
      11.76718712, 11.63769531]]), 
    1: np.array([[ 13.33630352, 29.17866523, 17.1005102675], [41.98976738, 
      6.44368712, 2.11764771]])} 

А следующий порог:

t=10 

Я хочу, чтобы новый Dict с 1, если каждое значение с плавающей точкой в d - >=t, и 0 если <t. Моя попытка

newd={k:[[1]] or [[0]] for k,[[v]] in d if [[v]]>=t} 

возвращается:

Traceback (most recent call last): 

    File "<ipython-input-152-68383ed9ad79>", line 1, in <module> 
    newd={k:[[1]] or [[0]] for k,[[v]] in d if [[v]]>=17} 

    File "<ipython-input-152-68383ed9ad79>", line 1, in <dictcomp> 
    newd={k:[[1]] or [[0]] for k,[[v]] in d if [[v]]>=17} 

TypeError: 'int' object is not iterable 

Как я должен "вносят изменения" мой сниппет?

Ожидаемый результат будет, в этом примере:

newd={0: np.array([[ 0, 1, 1], [1, 1, 1]]), 
     1: np.array([[ 1, 1, 1], [1, 0, 0]])} 
+1

Выглядит сложно, но для начала я предлагаю использовать 'd.items'. Прямо сейчас вы только итерации по клавишам. – Kevin

+0

Где находится 'array()'? – MackM

+0

Конечно, 'array()' является 'np.ndarray'. Мой плохой ... – FaCoffee

ответ

5

Вы можете использовать np.where как:

>>> new_d = {k:np.where(v >= 10, 1, 0) for k, v in d.iteritems()} 
>>> {0: array([[0, 1, 1],[1, 1, 1]]), 1: array([[1, 1, 1], [1, 0, 0]])} 

np.where метод принимает условие как первые пары и два значений x и y. Если указаны оба х и у, то выходной массив содержит элементы х, когда условие истинно, и элементы из у других

1
>>> from pprint import pprint 
>>> pprint(d) 
{0: array([[ 9.81650352, 10.03896523, 10.26972675], 
     [ 11.76386738, 11.76718712, 11.63769531]]), 
1: array([[ 13.33630352, 29.17866523, 17.10051027], 
     [ 41.98976738, 6.44368712, 2.11764771]])} 

Создать булевы массивы

>>> d2 = {k:v > t for k,v in d.items()} 
>>> pprint(d2) 
{0: array([[False, True, True], 
     [ True, True, True]], dtype=bool), 
1: array([[ True, True, True], 
     [ True, False, False]], dtype=bool)} 

Затем умножить на один

>>> d3 = {k: v * 1 for k, v in d2.items()} 
>>> pprint(d3) 
{0: array([[0, 1, 1], 
     [1, 1, 1]]), 
1: array([[1, 1, 1], 
     [1, 0, 0]])} 
>>> 

В одном шаге :

>>> d4 = {k : 1 * (v > t) for k,v in d.items()} 
>>> pprint(d4) 
{0: array([[0, 1, 1], 
     [1, 1, 1]]), 
1: array([[1, 1, 1], 
     [1, 0, 0]])} 
>>> 

Я начал с этого подхода, потому что я просто не различаю True/False и 1/0 - они эквивалентны мне. Но, возможно, использование numpy.where - лучшее решение.

+0

Приобретено. Ближе к идее, которую я изначально имел в виду. Но ... убежденный 'np.where' :) – FaCoffee

Смежные вопросы