繁体   English   中英

将数组拆分为数组列表

split an array into a list of arrays

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

如何通过分组变量拆分2D数组,并请返回数组列表(顺序也很重要)。

为了显示预期的结果,可以用

> (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 个回复

您可以使用熊猫:

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')

如果我理解您的问题,可以进行简单的切片,如下所示:

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')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题
 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM