2015-01-26 3 views
0

У меня есть массив вида:Как разбить массив numpy на основе столбца?

[[ 1. , 2.,  3.,  1.,  3.,  3.,  4. ], 
[ 1.3, 2.3, 3.3, 3.,  3.3, 3.3, 4.3 ], 
[ 1.2, 2.2, 3.2, 2.,  3.2, 3.2, 4.2 ], 
[ 1.1, 2.1, 1.,  1.,  3.,  3.,  4. ], 
[ 1.3, 2.3, 3.5, 3.,  3.3, 3.3, 4.3 ], 
[ 1.2, 2.7, 3.2, 2.,  3.2, 3.2, 4.2 ], 
[ 1.3, 2.2, 1.,  1.,  3.,  3.,  4. ], 
[ 1.3, 2.3, 3.6, 3.,  3.3, 3.3, 4.3 ], 
[ 1.2, 2.8, 3.2, 2.,  3.2, 3.2, 4.2 ], 
[ 1.4, 2.3, 1.,  1.,  3.,  3.,  4. ], 
[ 1.3, 2.3, 3.7, 3.,  3.3, 3.3, 4.3 ], 
[ 1.2, 2.9, 3.2, 2.,  3.2, 3.2, 4.2 ], 
[ 1.5, 2.1, 1.,  1.,  3.,  3.,  4. ], 
[ 1.89, 2.3, 3.5, 3.,  3.3, 3.3, 4.3 ], 
[ 1.2, 2.7, 3.2, 2.,  3.2, 3.231, 4.2 ], 
[ 1.9, 2.2, 1.,  1.,  3.,  3.,  4. ], 
[ 1.3, 2.22, 3.6, 3.,  3.3, 3.3, 4.3 ], 
[ 1.2, 2.8, 3.2, 2.,  3.66, 3.2, 4.2 ], 
[ 1.89, 2.3, 1.,  1.,  3.,  3.,  4. ], 
[ 1.3, 2.99, 3.7, 3.,  3.3, 3.3, 4.3 ], 
[ 1.2, 2.9, 3.2, 2.,  3.34, 3.2, 4.2 ]] 

Я хочу разделить этот массив на несколько подрешеток на основе четвертой колонка. То есть Я хочу один подмассив, четвертый столбец которого равен 1, другой, где четвертый столбец равен 2 и т. Д. Я не знаю заранее, какие все возможные значения есть в четвертом столбце.

Например, подмассив, соответствующий четвертой колонке, равном 1 является:

[[ 1.  2.  3.  1.  3.  3.  4. ], 
[ 1.1 2.1 1.  1.  3.  3.  4. ], 
[ 1.3 2.2 1.  1.  3.  3.  4. ], 
[ 1.4 2.3 1.  1.  3.  3.  4. ], 
[ 1.5 2.1 1.  1.  3.  3.  4. ], 
[ 1.9 2.2 1.  1.  3.  3.  4. ], 
[ 1.89 2.3 1.  1.  3.  3.  4. ]] 

ответ

1

Чтобы сделать список массивов:

y = [x[x[:,3]==k] for k in np.unique(x[:,3])] 
+0

Спасибо! Это работает – Lanc

-2

Посмотрите на docs для разделения массива на несколько суб-массивов.

numpy.hsplit (ичных, indices_or_sections)

Разделить массив на несколько подмассивов по горизонтали (по столбцам).

Так что у вас есть 4x4 массив A:

array([[ 0., 1., 2., 3.], 
    [ 4., 5., 6., 7.], 
    [ 8., 9., 10., 11.], 
    [ 12., 13., 14., 15.]]) 

split = numpy.hsplit(A,4) = 

[array([[ 0.], 
    [ 4.], 
    [ 8.], 
    [ 12.]]), array([[ 1.], 
    [ 5.], 
    [ 9.], 
    [ 13.]]), array([[ 2.], 
    [ 6.], 
    [ 10.], 
    [ 14.]]), array([[ 3.], 
    [ 7.], 
    [ 11.], 
    [ 15.]])] 
+0

Можете ли вы указать мне на дублирующий вопрос? – Lanc

+0

извините, неправильный функция. этот должен быть прост в использовании. – bryce

1

Вы можете сделать это в O(NlogN) время использования numpy.argsort, numpy.array_split, numpy.diff и numpy.where:

>>> indices = np.argsort(arr[:, 3]) 
>>> arr_temp = arr[indices] 
>>> np.array_split(arr_temp, np.where(np.diff(arr_temp[:,3])!=0)[0]+1) 
[array([[ 1. , 2. , 3. , 1. , 3. , 3. , 4. ], 
     [ 1.89, 2.3 , 1. , 1. , 3. , 3. , 4. ], 
     [ 1.1 , 2.1 , 1. , 1. , 3. , 3. , 4. ], 
     [ 1.9 , 2.2 , 1. , 1. , 3. , 3. , 4. ], 
     [ 1.3 , 2.2 , 1. , 1. , 3. , 3. , 4. ], 
     [ 1.5 , 2.1 , 1. , 1. , 3. , 3. , 4. ], 
     [ 1.4 , 2.3 , 1. , 1. , 3. , 3. , 4. ]]), array([[ 1.2 , 2.8 , 3.2 , 2. , 3.66 , 3.2 , 4.2 ], 
     [ 1.2 , 2.7 , 3.2 , 2. , 3.2 , 3.231, 4.2 ], 
     [ 1.2 , 2.9 , 3.2 , 2. , 3.2 , 3.2 , 4.2 ], 
     [ 1.2 , 2.9 , 3.2 , 2. , 3.34 , 3.2 , 4.2 ], 
     [ 1.2 , 2.8 , 3.2 , 2. , 3.2 , 3.2 , 4.2 ], 
     [ 1.2 , 2.7 , 3.2 , 2. , 3.2 , 3.2 , 4.2 ], 
     [ 1.2 , 2.2 , 3.2 , 2. , 3.2 , 3.2 , 4.2 ]]), array([[ 1.3 , 2.3 , 3.6 , 3. , 3.3 , 3.3 , 4.3 ], 
     [ 1.89, 2.3 , 3.5 , 3. , 3.3 , 3.3 , 4.3 ], 
     [ 1.3 , 2.3 , 3.5 , 3. , 3.3 , 3.3 , 4.3 ], 
     [ 1.3 , 2.22, 3.6 , 3. , 3.3 , 3.3 , 4.3 ], 
     [ 1.3 , 2.3 , 3.3 , 3. , 3.3 , 3.3 , 4.3 ], 
     [ 1.3 , 2.99, 3.7 , 3. , 3.3 , 3.3 , 4.3 ], 
     [ 1.3 , 2.3 , 3.7 , 3. , 3.3 , 3.3 , 4.3 ]])] 
Смежные вопросы