Задавать вопрос на основе другого поста относительно блока Ошибка значения должно быть 2-D - PullRequest
0 голосов
/ 01 ноября 2018

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

Мой текущий ввод имеет такую ​​форму:

[array([[0.1,0.2], [0.3, 0.4], [0.5, 0.6]])]

к этому, если возможно:

[[[0.1,0.2], [0.3, 0.4], [0.5, 0.6]]]

Я получил ту же ошибку и с той же проблемой:

ValueError: blocks must be 2-D

Что я хотел спросить, основываясь на решении, приведенном в посте, так это то, есть ли способ не конвертировать плотный массив в coo_matrix. Поскольку для преобразования потребуется много процессов, есть ли способ просто как-то изменить его на 2D, а затем использовать hstack?

Вот этот пост:

scipy.sparse.hstack (([1], [2])) -> «ValueError: блоки должны быть двумерными». Почему?

1 Ответ

0 голосов
/ 01 ноября 2018

Вы показываете список, который содержит массив:

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. Используйте его, если у вас уже есть несколько больших разреженных матриц, и вы хотите присоединиться к ним, или, возможно, добавить плотный столбец или строку. Больше всего на свете это удобный инструмент для построения больших разреженных матриц из маленьких кусочков.

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