如果给定列表或numpy数组,它们的尺寸和长度与定义为相同
lista = [5,2,5,...]
listb = [5,1,8,...]
listc = [1,7,8,...]
listd = [1,0,5,...]
liste = [1,2,1,...]
listf = [9,1,8,...]
如何获得具有第一个索引被分组并放入多维数组的输出的多维数组?
resulting_list = [[[5,2,5,...], [5,1,8,...]],
[[1,7,8,...], [1,0,5,...], [1,2,1,...]],
[[9,1,8,...]]]
我对此的解决方案是for循环,但是我基本上没有成功,使用numpy.append,numpy.concatenate,numpy.vstack等都没有成功。
这是我的示例解决方案之一,应该注意的是,列表最初是总是与数组中单个堆栈中的第一个索引分组在一起的(但不一定按不需要的顺序排列)。
#Data
lista = np.array([5,2,5])
listb = np.array([5,1,8])
listc = np.array([1,7,8])
listd = np.array([1,0,5])
liste = np.array([1,2,1])
listf = np.array([9,1,8])
list_index = np.vstack((lista, listb, listc, listd, liste, listf))
result_list = lista
for i in range(4):
if list_index[i][0] == list_index[i+1][0]:
result_list = np.append(result_list, list_index[i+1], axis=0)
else:
result_list = np.append(result_list, list_index[i+1], axis=1)
AxisError: axis 1 is out of bounds for array of dimension 1
通常,我在将这些列表附加到新维度或沿特定轴时遇到问题。
以下是一种解决方案:
>>> lists = [lista, listb, listc, listd, liste, listf]
>>> first_vals = {x[0] for x in lists} # unique first element values
>>> res = [np.array([x for x in lists if x[0] == v]) for v in first_vals]
>>> res
[array([[1, 7, 8],
[1, 0, 5],
[1, 2, 1]]),
array([[5, 2, 5],
[5, 1, 8]]),
array([[9, 1, 8]])]
这给出了按第一个元素分组的二维数组的列表。您可以使用dtype=object
将整个对象转换成一个数组(因为2D数组通常具有不同的形状),但是这样做的确没有意义。
不如已接受的答案那么简洁,但风格上与您尝试做的事情更接近。我主要是在列表中收集行,而不是使用数组追加。列表附加更易于使用,而且速度更快。
In [119]: lista = np.array([5,2,5])
...: listb = np.array([5,1,8])
...: listc = np.array([1,7,8])
...: listd = np.array([1,0,5])
...: liste = np.array([1,2,1])
...: listf = np.array([9,1,8])
...:
...: lists = [lista, listb, listc, listd, liste, listf]
在列表列表中收集值:
In [126]: result_list = []
...: alist = []; first = lists[0][0]
...: for row in lists:
...: if row[0]==first:
...: alist.append(row)
...: else:
...: result_list.append(alist)
...: alist = [row]; first = row[0]
...: result_list.append(alist)
In [127]: result_list
Out[127]:
[[array([5, 2, 5]), array([5, 1, 8])],
[array([1, 7, 8]), array([1, 0, 5]), array([1, 2, 1])],
[array([9, 1, 8])]]
可选地将内部列表转换为数组:
In [128]: [np.vstack(x) for x in result_list]
Out[128]:
[array([[5, 2, 5],
[5, 1, 8]]), array([[1, 7, 8],
[1, 0, 5],
[1, 2, 1]]), array([[9, 1, 8]])]