【问题标题】:How do I append numpy arrays along a new axis or dimension without flattening如何在不展平的情况下沿新轴或维度附加 numpy 数组
【发布时间】:2020-09-03 07:44:23
【问题描述】:

如果给定一个具有相同维度和长度的列表或 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

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

【问题讨论】:

  • 你不能只做return_list = [lista, listb, listc, listd, liste, listf]吗?
  • 第一个索引是标识符,它们必须分开,因为将来的函数将处理 return_list。
  • np.append 只是调用np.concatenate 的另一种方式(如果您不提供轴,则使用展平)。在循环中重复使用这些stack/concatante 中的任何一个都是一个坏主意。先用列表方法进行分组。

标签: python numpy scipy numpy-ndarray


【解决方案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 将整个东西转换为一个数组(因为二维数组通常具有不同的形状),但我真的认为这样做没有任何意义。

【讨论】:

  • 对我困扰了很长时间的问题的简洁解决方案,谢谢!
【解决方案2】:

不像公认的答案那样简洁,但在风格上更接近你想要做的事情。主要是我在列表中收集行,而不是使用数组追加。列表追加更容易使用,速度更快。

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

【讨论】:

    猜你喜欢
    • 2012-04-20
    • 2011-01-22
    • 1970-01-01
    • 2014-08-01
    • 2019-08-26
    • 2021-03-20
    • 2015-01-29
    • 2013-11-07
    相关资源
    最近更新 更多