2016-07-18 5 views
2

К примеру, у меня естьКак создать массив меток numpy из массива numpy float?

arr=np.linspace(0,1,11) 

и я хочу, чтобы обозначить номера n<0.25 этикетку "a", n>0.75 этикетки "c", номер между этикеткой "b". результат будет

array(['a', 'a', 'a', 'b', ..., 'c']) 

Я пытался что-то вроде arr[arr<0.25]='a', но он будет работать только один раз, так как там будет строка сравнения с поплавком на следующей команде. Я могу добиться этого, проверив его тип перед сравнением, используя цикл for, но это сложно. Есть ли прямой способ достичь этого?

ответ

1

Массивы NumPy являются однородными. Вы должны установить тип для массива этикеток

import numpy as np 
arr=np.linspace(0,1,11) 
lbl=np.empty((arr.shape), dtype=object) 
lbl[arr<.25]='a' 
lbl[(arr>=.25) & (arr <=.75)] = 'b' 
lbl[arr>.75]='c' 

print arr 
print lbl 

Выход:

[ 0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ] 
['a' 'a' 'a' 'b' 'b' 'b' 'b' 'b' 'c' 'c' 'c'] 
2

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

ID = (arr>0.75)*1 + (arr>=0.25) 
select_arr = np.array(['a','b','c']) 
out = select_arr[ID] 

Sample пробег -

In [64]: arr # Modified from sample posted in question to include 0.75 
Out[64]: 
array([ 0. , 0.1 , 0.2 , 0.3 , 0.4 , 0.5 , 0.6 , 0.7 , 0.75, 
     0.9 , 1. ]) 

In [65]: ID = (arr>0.75)*1 + (arr>=0.25) 
    ...: select_arr = np.array(['a','b','c']) 
    ...: out = select_arr[ID] 
    ...: 

In [66]: out 
Out[66]: 
array(['a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b', 'c', 'c'], 
     dtype='|S1') 
Смежные вопросы