Ошибка трансляции при добавлении ndarray и разреженной матрицы, преобразованной в плотный в python - PullRequest
2 голосов
/ 27 марта 2012

Я преобразовываю скудную разреженную матрицу в плотную матрицу и добавляю ее к ndarray, используя оператор + =, и получаю ошибку трансляции. Ndarray имеет форму (M,), в то время как плотная матрица имеет форму (M, 1). Когда я пытаюсь преобразовать numpy.matrix в ndarray, форма становится (1, M). Я также попытался использовать изменение формы (M,) после преобразования, и форма становится (M, M). Может кто-нибудь объяснить, где я все испортил.

M = 100
N = 1000
K = 4
a= np.zeros((M,K))

b = sp.csr_matrix(np.ones((N,1)))
d = sp.csr_matrix(np.ones((M,N)))

c = np.ones(())
for k in range(K): 
    a[:,k] += d.dot(b).todense()

P.S .: Я новичок в Python и в стеке. Извиняюсь, если это неправильно сформулированный вопрос или этот вопрос уже задавался ранее (я не смог его найти)

1 Ответ

1 голос
/ 27 марта 2012

Примечание для будущих гуглов, код OP имеет следующий импортированный пакет:

> import numpy as np
> import scipy.sparse as sp

В любом случае, давайте начнем с нашего объяснения.


Вы можете проверить размер матрицы, используя:

> np.shape(your_matrix_here) #equals to MATLAB: > size(your_matrix_here)

Когда вы вызываете todense (), вы получаете:

matrix([[ 1000.],  #shape: (1, 100)
        [ 1000.],
        [ 1000.],
        ...

, а [:, 1] выглядит так:

array([ 0.,  0., ... ,  0.,  0.]) #shape: (100,)

ИтакВы можете захотеть транспонировать матрицу с помощью transpose ().


Но транспонирование матрицы возвращает матрицу, содержащую матрицу:

matrix([[ 1000.,  1000., ... , 1000.,  1000.]]) #shape: (1, 100)

и по какой-то причине d.dot(b).todense().transpose()[0] не возвращаетсяпервый элемент матрицы:

matrix([[ 1000.,  1000., ... , 1000.,  1000.]]) #still the same!

Это можно исправить с помощью:

> np.array(d.dot(b).todense().transpose())[0]

, таким образом возвращая:

array([ 1000.,  1000., ... 1000.,  1000.])

Теперь дваиз них получили одинаковую форму, что позволило им выполнять матричные операции:

> np.shape(np.array(d.dot(b).todense().transpose())[0]) #(100,)

> np.shape(a[:,1])                                      #(100,)

В заключение вы хотите изменить эту строку:

a[:,k] += d.dot(b).todense()

до:

a[:,k] += np.array(d.dot(b).todense().transpose())[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...