Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将矩阵中的值与长度不等的项分组_Python_Arrays_Numpy_Grouping - Fatal编程技术网

Python 如何将矩阵中的值与长度不等的项分组

Python 如何将矩阵中的值与长度不等的项分组,python,arrays,numpy,grouping,Python,Arrays,Numpy,Grouping,假设我有一个简单的数组: a = np.arange(3) 以及具有相同长度的索引数组: I = np.array([0, 0, 1]) 现在我想根据索引对值进行分组。 如何对第一个数组的元素进行分组以产生以下结果 np.array([[0, 1], [2], dtype=object) 以下是我尝试过的: a = np.arange(3) I = np.array([0, 0, 1]) out = np.empty(2, dtype=object) out.fill([]) asli

假设我有一个简单的数组:

a = np.arange(3)
以及具有相同长度的索引数组:

I = np.array([0, 0, 1])
现在我想根据索引对值进行分组。 如何对第一个数组的元素进行分组以产生以下结果

np.array([[0, 1], [2], dtype=object)

以下是我尝试过的:

a = np.arange(3)
I = np.array([0, 0, 1])
out = np.empty(2, dtype=object)
out.fill([])

aslists = np.vectorize(lambda x: [x], otypes=['object'])

out[I] += aslists(a)
但是,这种方法不会连接列表,而是只维护每个索引的最后一个值:

array([[1], [2]], dtype=object)

或者,对于二维情况:

a = np.random.rand(100)
I = (np.random.random(100) * 5 //1).astype(int)
J = (np.random.random(100) * 5 //1).astype(int)

out = np.empty((5, 5), dtype=object)
out.fill([])

如何根据两个索引数组将项目从a追加到out?

1D Case

假设对
I
进行排序,将数组列表作为输出-

idx = np.unique(I, return_index=True)[1]
out = np.split(a,idx)[1:]
np.array([i.tolist() for i in out])
另一个使用
slicing
获取
idx
进行分割
a
-

out = np.split(a, np.flatnonzero(I[1:] != I[:-1])+1)
获取列表数组作为输出的步骤-

idx = np.unique(I, return_index=True)[1]
out = np.split(a,idx)[1:]
np.array([i.tolist() for i in out])
样本运行-

In [84]: a = np.arange(3)

In [85]: I = np.array([0, 0, 1])

In [86]: out = np.split(a, np.flatnonzero(I[1:] != I[:-1])+1)

In [87]: out
Out[87]: [array([0, 1]), array([2])]

In [88]: np.array([i.tolist() for i in out])
Out[88]: array([[0, 1], [2]], dtype=object)

2D案例

对于
2D
填充到
2D
数组的情况,使用两个数组
I
J
中的索引进行分组,这两个数组表示要分配组的行和列,我们可以这样做-

ncols = 5
lidx = I*ncols+J
sidx = lidx.argsort() # Use kind='mergesort' to keep order
lidx_sorted = lidx[sidx]
unq_idx, split_idx = np.unique(lidx_sorted, return_index=True)
out.flat[unq_idx] = np.split(a[sidx], split_idx)[1:]

很好的解决方案!对于我的最终应用程序,我正在寻找类似的东西,但我的输出数组是二维的,并且我有一个用于两个维度的索引数组:I=np.array([0,0,1]);J=np.数组([1,0,0]);out=np.empty((2,2),dtype=object)。你也知道这个问题的解决方案吗?@JohnDamen所以,我们需要用零或其他无效的说明符来填充不可用的说明符?我猜输出会是这样的:
[[0,1][2,NA]]
?列表可能是不均匀的,主要的一点是按照2维的索引进行分组,就是这样!目前还没有,但我可以分类,是的