Ошибка при объединении разделенной части массива numpy

#python #arrays #numpy

#python #массивы #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. что вы пытаетесь сделать?

2. Мне нужно разделить массив numpy на 4 части и брать по одной части за раз, а остальные три объединить.

Ответ №1:

Вы смешиваете списки и массивы. Обратите внимание на то, что вы получаете на каждом этапе:

Начните со списка кортежей:

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

Создайте 2d-массив:

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

Вы могли бы воссоздать 2d-массив, применив 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]])
  

является ли define для списков оператором объединения. Для массивов это сложение. concatenate (наряду с различными stack вариантами) — это функция объединения массива.