превращение списка numpy.ndarray в матрицу для выполнения умножения - PullRequest
0 голосов
/ 28 мая 2019

У меня есть векторы этого вида:

test=np.linspace(0,1,10)

Я хочу расположить их горизонтально, чтобы сделать матрицу.проблема в том, что я определяю их в цикле, поэтому первый стек находится между пустой матрицей и вектором первого столбца, что дает следующую ошибку:

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

нижняя строка - у меня есть цикл for, который с каждымитерация создает вектор p1, и я хочу добавить его в окончательную матрицу вида: [p1 p2 p3 p4], с которой я мог бы затем выполнять матричные операции, такие как умножение на транспонированный и т. д.

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Если у вас есть список одномерных массивов, которые вы хотите разместить горизонтально, вы можете сначала преобразовать их все в столбцы, но, вероятно, проще просто сложить их по вертикали и затем транспонировать:

In [6]: vector_list = [np.linspace(0, 1, 10) for _ in range(3)]

In [7]: np.vstack(vector_list).T
Out[7]:
array([[0.        , 0.        , 0.        ],
       [0.11111111, 0.11111111, 0.11111111],
       [0.22222222, 0.22222222, 0.22222222],
       [0.33333333, 0.33333333, 0.33333333],
       [0.44444444, 0.44444444, 0.44444444],
       [0.55555556, 0.55555556, 0.55555556],
       [0.66666667, 0.66666667, 0.66666667],
       [0.77777778, 0.77777778, 0.77777778],
       [0.88888889, 0.88888889, 0.88888889],
       [1.        , 1.        , 1.        ]])
0 голосов
/ 28 мая 2019

Как вы получили эту ошибку измерения?При чем тут empty array?

Список массивов одинаковой длины:

In [610]: alist = [np.linspace(0,1,6), np.linspace(10,11,6)]                                          
In [611]: alist                                                                                       
Out[611]: 
[array([0. , 0.2, 0.4, 0.6, 0.8, 1. ]),
 array([10. , 10.2, 10.4, 10.6, 10.8, 11. ])]

Несколько способов сделать из них массив:

In [612]: np.array(alist)                                                                             
Out[612]: 
array([[ 0. ,  0.2,  0.4,  0.6,  0.8,  1. ],
       [10. , 10.2, 10.4, 10.6, 10.8, 11. ]])

In [614]: np.stack(alist)                                                                             
Out[614]: 
array([[ 0. ,  0.2,  0.4,  0.6,  0.8,  1. ],
       [10. , 10.2, 10.4, 10.6, 10.8, 11. ]])

Если вы хотите объединить их в столбцы, вы можете транспонировать один из вышеперечисленных или использовать:

In [615]: np.stack(alist, axis=1)                                                                     
Out[615]: 
array([[ 0. , 10. ],
       [ 0.2, 10.2],
       [ 0.4, 10.4],
       [ 0.6, 10.6],
       [ 0.8, 10.8],
       [ 1. , 11. ]])

np.column_stack также удобно.

В новых версиях NumPy выможет сделать:

In [617]: np.linspace((0,10),(1,11),6)                                                                
Out[617]: 
array([[ 0. , 10. ],
       [ 0.2, 10.2],
       [ 0.4, 10.4],
       [ 0.6, 10.6],
       [ 0.8, 10.8],
       [ 1. , 11. ]])

Вы не указываете, как вы создаете «пустой массив» и как вы пытаетесь складывать.Я не могу точно воссоздать сообщение об ошибке (полный обратный вызов помог бы).Но, учитывая это сообщение, вы проверили количество измерений входов?Они совпадают?

Сложно сложить массив в цикле.Вы должны обратить пристальное внимание на формы, особенно на исходный «пустой» массив.Нет близкого аналога пустому списку [].np.array([]) это 1d с формой (1,).np.empty((0,6)) 2d с формой (0,6).Также все функции суммирования создают новый массив с каждым вызовом (не работают на месте), поэтому они неэффективны (по сравнению с добавлением в список).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...