2015-04-21 3 views
1

создать две матрицыPython массив/матрица размерности

import numpy as np 
arrA = np.zeros((9000,3)) 
arrB = np.zerros((9000,6)) 

Я хочу объединить части этих матриц. Но когда я пытаюсь сделать:

arrC = np.hstack((arrA, arrB[:,1])) 

Я получаю сообщение об ошибке:

ValueError: all the input arrays must have same number of dimensions 

Я думаю, это потому, что np.shape(arrB[:,1]) равно (9000,) вместо (9000,1), но я не могу понять, как решить ее.

Не могли бы вы прокомментировать эту проблему?

+1

Я действительно не вижу твоей проблемы здесь. У вас есть массив 9000x3 и 9000x6, они разных размеров, поэтому вы не можете конкатрировать их вместе ... Я что-то упустил? –

+0

Я хочу взять массив 9000x3 и объединить его с массивом 9000x1, получающим массив 9000x4. Надеюсь, что этот комментарий полностью описывает мою проблему. – Leopoldo

+0

Да, формат размеров и размеров матриц неверен, они должны быть равны. Попробуйте np.hstack ((arrA, np.zeros ((arrayB [1], 3)))) –

ответ

3

Вы можете сохранить размеры, передавая список индексов, а не индекс:

>>> arrB[:,1].shape 
(9000,) 
>>> arrB[:,[1]].shape 
(9000, 1) 
>>> out = np.hstack([arrA, arrB[:,[1]]]) 
>>> out.shape 
(9000, 4) 
+0

Спасибо, это работает! – Leopoldo

2

Я хотел бы попробовать что-то вроде этого:

np.vstack((arrA.transpose(), arrB[:,1])).transpose() 
+0

Комментарий о * почему * это работает было бы хорошо – dawg

+0

Это работает, и это немного сложно. Спасибо за ваш комментарий. – Leopoldo

2

там несколько способов сделать свой выбор из arrB в (9000,1) массив:

np.hstack((arrA,arrB[:,[1]])) 
np.hstack((arrA,arrB[:,1][:,None])) 
np.hstack((arrA,arrB[:,1].reshape(9000,1))) 
np.hstack((arrA,arrB[:,1].reshape(-1,1))) 

Один использует con cept индексации с помощью массива или списка, следующий добавляет новую ось (например, np.newaxis), третий использует reshape. Это все основные задачи манипулирования массивами.

2

Это легче увидеть визуально.

Предположим:

>>> arrA=np.arange(9000*3).reshape(9000,3) 
>>> arrA 
array([[ 0,  1,  2], 
     [ 3,  4,  5], 
     [ 6,  7,  8], 
     ..., 
     [26991, 26992, 26993], 
     [26994, 26995, 26996], 
     [26997, 26998, 26999]]) 
>>> arrB=np.arange(9000*6).reshape(9000,6) 
>>> arrB 
array([[ 0,  1,  2,  3,  4,  5], 
     [ 6,  7,  8,  9, 10, 11], 
     [ 12, 13, 14, 15, 16, 17], 
     ..., 
     [53982, 53983, 53984, 53985, 53986, 53987], 
     [53988, 53989, 53990, 53991, 53992, 53993], 
     [53994, 53995, 53996, 53997, 53998, 53999]]) 

Если взять кусочек КРРП, вы производите ряд, который больше похож на ряд:

>>> arrB[:,1] 
array([ 1,  7, 13, ..., 53983, 53989, 53995]) 

Что вам нужно, это столбец такой же формы, как столбец, чтобы добавить к Arra:

>>> arrB[:,[1]] 
array([[ 1], 
     [ 7], 
     [ 13], 
     ..., 
     [53983], 
     [53989], 
     [53995]]) 

Тогда hstack работает, как ожидалось:

>>> arrC=np.hstack((arrA, arrB[:,[1]])) 
>>> arrC 
array([[ 0,  1,  2,  1], 
     [ 3,  4,  5,  7], 
     [ 6,  7,  8, 13], 
     ..., 
     [26991, 26992, 26993, 53983], 
     [26994, 26995, 26996, 53989], 
     [26997, 26998, 26999, 53995]]) 

Альтернативная форма является указание -1 в одном измерении, а число строк или COLS желательно в другой в .reshape():

>>> arrB[:,1].reshape(-1,1) # one col 
array([[ 1], 
     [ 7], 
     [ 13], 
     ..., 
     [53983], 
     [53989], 
     [53995]]) 
>>> arrB[:,1].reshape(-1,6) # 6 cols 
array([[ 1,  7, 13, 19, 25, 31], 
     [ 37, 43, 49, 55, 61, 67], 
     [ 73, 79, 85, 91, 97, 103], 
     ..., 
     [53893, 53899, 53905, 53911, 53917, 53923], 
     [53929, 53935, 53941, 53947, 53953, 53959], 
     [53965, 53971, 53977, 53983, 53989, 53995]]) 
>>> arrB[:,1].reshape(2,-1) # 2 rows 
array([[ 1,  7, 13, ..., 26983, 26989, 26995], 
     [27001, 27007, 27013, ..., 53983, 53989, 53995]]) 

Существует более на формирование массива и укладки here

+0

Спасибо за ваше объяснение – Leopoldo

Смежные вопросы