我如何沿新轴或维度附加numpy数组而不进行展平

问题描述 投票:0回答:2

如果给定列表或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

通常,我在将这些列表附加到新维度或沿特定轴时遇到问题。

python numpy scipy numpy-ndarray
2个回答
2
投票

以下是一种解决方案:

>>> 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数组通常具有不同的形状),但是这样做的确没有意义。


0
投票

不如已接受的答案那么简洁,但风格上与您尝试做的事情更接近。我主要是在列表中收集行,而不是使用数组追加。列表附加更易于使用,而且速度更快。

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]])]
© www.soinside.com 2019 - 2024. All rights reserved.