разбить массив на список массивов - PullRequest
0 голосов
/ 14 ноября 2018

Как разделить двумерный массив по группирующей переменной и вернуть список массивов, пожалуйста (также важен порядок).

Чтобы показать ожидаемый результат, эквивалент в R можно сделать как

> (A = matrix(c("a", "b", "a", "c", "b", "d"), nr=3, byrow=TRUE)) # input
     [,1] [,2]
[1,] "a"  "b" 
[2,] "a"  "c" 
[3,] "b"  "d" 
> (split.data.frame(A, A[,1])) # output
$a
     [,1] [,2]
[1,] "a"  "b" 
[2,] "a"  "c" 

$b
     [,1] [,2]
[1,] "b"  "d" 

РЕДАКТИРОВАТЬ: Чтобы уточнить: я хотел бы разбить массив / матрицу, A на список из нескольких массивов на основе уникальных значений в первом столбце.То есть, разделить A на один массив, где первый столбец имеет a, и другой массив, где первый столбец имеет b.

Я пробовал Python-эквивалент R "функция "split" , но это дает три массива

import numpy as np
import itertools
A = np.array([["a", "b"], ["a", "c"], ["b", "d"]])
b = a[:,0]

def split(x, f):
     return list(itertools.compress(x, f)), list(itertools.compress(x, (not i for i in f)))
split(A, b) 

([array(['a', 'b'], dtype='<U1'),
  array(['a', 'c'], dtype='<U1'),
  array(['b', 'd'], dtype='<U1')],
 [])

, а также numpy.split, используя np.split(A, b), но для которых нужны целые числа.Хотя я, возможно, смогу использовать Как преобразовать строки в целые числа в Python? , чтобы преобразовать буквы в целые числа, но даже если я передаю целые числа, он не разбивается, как ожидалось

c = np.transpose(np.array([1,1,2]))
np.split(A, c) # returns 4 arrays

Можно ли это сделать?спасибо

РЕДАКТИРОВАТЬ: обратите внимание, что это небольшой пример, и число групп может быть больше двух, и они могут не быть заказаны.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Вы можете использовать панд:

import pandas as pd
import numpy as np

a = np.array([["a", "b"], ["a", "c"], ["b", "d"]])

listofdfs = {}
for n,g in pd.DataFrame(a).groupby(0):
    listofdfs[n] = g

listofdfs['a'].values

Выход:

array([['a', 'b'],
       ['a', 'c']], dtype=object)

И

listofdfs['b'].values

Выход:

array([['b', 'd']], dtype=object)

Или вы можете использовать itertools groupby:

import numpy as np
from itertools import groupby
l = [np.stack(list(g)) for k, g in groupby(a, lambda x: x[0])]

l[0]

Выход:

array([['a', 'b'],
       ['a', 'c']], dtype='<U1')

И

l[1]

Выход:

array([['b', 'd']], dtype='<U1')
0 голосов
/ 14 ноября 2018

Если я понимаю ваш вопрос, вы можете сделать простую нарезку, как в:

a = np.array([["a", "b"], ["a", "c"], ["b", "d"]])

x,y=a[:2,:],a[2,:]

x
array([['a', 'b'],
       ['a', 'c']], dtype='<U1')

y
array(['b', 'd'], dtype='<U1')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...