合并numpy数组的拆分部分时出错

时间:2019-03-14 16:32:33

标签: python arrays numpy

test = [(0,1,2),(9,0,1),(0,1,3),(0,1,8)]
test=np.array(test)
test = np.array_split(test, 4)
t_0 = test[:0]
t_1 = test[0]
new_test= t_0+test[1:]
print(new_test)  

它给了我以下答案:[array([[9, 0, 1]]), array([[0, 1, 3]]), array([[0, 1, 8]])]

如果我从测试中选择第一组,我的目标是[(9,0,1),(0,1,3),(0,1,8)]

1 个答案:

答案 0 :(得分:1)

您正在混合列表和数组。注意每个阶段的收获:

从元组列表开始:

In [126]: test = [(0,1,2),(9,0,1),(0,1,3),(0,1,8)]                              

制作二维数组:

In [127]: arr = np.array(test)                                                  
In [128]: arr                                                                   
Out[128]: 
array([[0, 1, 2],
       [9, 0, 1],
       [0, 1, 3],
       [0, 1, 8]])

分成一个列表-每个元素一个“行”,但每个元素都是一个2d数组。问题,分割数将始终是这个大小吗?

In [129]: alist = np.array_split(arr, arr.shape[0])                             
In [130]: alist                                                                 
Out[130]: 
[array([[0, 1, 2]]),
 array([[9, 0, 1]]),
 array([[0, 1, 3]]),
 array([[0, 1, 8]])]

子列表:

In [131]: alist[:0]                                                             
Out[131]: []
In [132]: alist[1:]                                                             
Out[132]: [array([[9, 0, 1]]), array([[0, 1, 3]]), array([[0, 1, 8]])]

列表加入:

In [133]: alist[:0] + alist[1:]                                                 
Out[133]: [array([[9, 0, 1]]), array([[0, 1, 3]]), array([[0, 1, 8]])]

看起来像您想要的是元组列表,就像您开始时那样:

In [134]: test[:0] + test[1:]                                                   
Out[134]: [(9, 0, 1), (0, 1, 3), (0, 1, 8)]

您可以通过将concatenate应用于连接的数组列表来重新创建二维数组:

In [135]: np.concatenate(alist[:0] + alist[1:])                                 
Out[135]: 
array([[9, 0, 1],
       [0, 1, 3],
       [0, 1, 8]])
In [136]: np.concatenate(alist[:1] + alist[2:])                                 
Out[136]: 
array([[0, 1, 2],
       [0, 1, 3],
       [0, 1, 8]])
In [137]: np.concatenate(alist[:2] + alist[3:])                                 
Out[137]: 
array([[0, 1, 2],
       [9, 0, 1],
       [0, 1, 8]])

但是请注意,您可以通过索引轻松获得这些数组中的任何一个:

In [138]: arr[[0,1,3],:]                                                        
Out[138]: 
array([[0, 1, 2],
       [9, 0, 1],
       [0, 1, 8]])

借助r_帮助器,您可以从范围构建索引:

In [139]: np.r_[:2, 3:4]                                                        
Out[139]: array([0, 1, 3])
In [140]: arr[np.r_[:2, 3:4],:]                                                 
Out[140]: 
array([[0, 1, 2],
       [9, 0, 1],
       [0, 1, 8]])

您也可以在建立索引后进行联接:

In [141]: np.concatenate([arr[:2,:], arr[3:,:]], axis=0)                        
Out[141]: 
array([[0, 1, 2],
       [9, 0, 1],
       [0, 1, 8]])

+用于为列表定义一个联接运算符。对于数组,它是加法。 concatenate(以及各种stack变体)是数组连接函数。