Вы показываете список, который содержит массив:
In [370]: alist = [np.array([[0.1,0.2], [0.3, 0.4], [0.5, 0.6]])]
In [371]: alist
Out[371]:
[array([[0.1, 0.2],
[0.3, 0.4],
[0.5, 0.6]])]
Просто оборачивая это в np.array
, получаем трехмерный массив:
In [372]: np.array(alist)
Out[372]:
array([[[0.1, 0.2],
[0.3, 0.4],
[0.5, 0.6]]])
numpy hstack
создает массив 2d:
In [373]: np.hstack(alist)
Out[373]:
array([[0.1, 0.2],
[0.3, 0.4],
[0.5, 0.6]])
То есть он берет список из 1 элемента и ни к чему не присоединяет, возвращая сам элемент.
Я не понимаю, почему вы попадаете на редкость hstack
.
Правильный способ использования alist
в разреженном hstack:
In [386]: sparse.hstack([sparse.coo_matrix(alist[0])])
Out[386]:
<3x2 sparse matrix of type '<class 'numpy.float64'>'
with 6 stored elements in COOrdinate format>
In [387]: _.A
Out[387]:
array([[0.1, 0.2],
[0.3, 0.4],
[0.5, 0.6]])
sparse.coo_matrix(alist)
не работает, потому что, как отмечено выше, создание массива из него создает трехмерный массив. Поэтому мы должны вычеркнуть его из списка alist[0]
. Затем создайте разреженную матрицу, которую затем можно передать в bmat
для дальнейшей обработки.
Я думаю, что описал в другом вопросе SO, sparse.hstack
работает, соединяя атрибуты coo
входных массивов, создавая новую матрицу coo
в процессе. Таким образом, даже если бы мы могли передать какой-то список или плотный массив в hstack
, он все равно должен будет создать матрицу coo
из каждого элемента.
Не используйте sparse.hstack
, если вы хотите более быструю версию плотного concatenate
. Используйте его, если у вас уже есть несколько больших разреженных матриц, и вы хотите присоединиться к ним, или, возможно, добавить плотный столбец или строку. Больше всего на свете это удобный инструмент для построения больших разреженных матриц из маленьких кусочков.