2016-12-29 6 views
1
>>> import numpy as np 
>>> from scipy.sparse import * 
>>> x1 = np.eye(3, dtype=float) 
>>> x2 = csr_matrix(x1, dtype=float, shape =x1.shape) 
>>> assert x2.todense().any()==x1.any() ## holds true 
>>> w = np.ones((3,1)) 
>>> dw1 = w - x1[:,0] 
>>> dw2 = w - x2[:,0] 

, который дает мненеожиданный результат вызван scipy.csr_matrix

>>> print dw1 
[[ 0. 1. 1.] 
[ 0. 1. 1.] 
[ 0. 1. 1.]] 

в то время как

>>> print dw2 
[[ 0.] 
[ 1.] 
[ 1.]] 

Мой вопрос почему dw1 и dw2 отличаются? Должны ли они отложить, это ошибка? Большое спасибо!

+0

'x2' является разреженной * матрицей * и ведет себя как плотная матрица, например. 'Np.matrix (x1)'. Здесь 'x2 [:, 0]' является (3,1) матрицей. – hpaulj

ответ

1

Это вопрос обрезки/индексации. Сомнительная линия здесь

w - x1[:, 0] 

, который не имеет ничего общего с разреженности. Вы нарезали x1, получив 1D-массив. Когда это вычитается из w, numpy передает этот массив обратно в матрицу 3 на 3 (потому что она сравнивает количество столбцов обоих терминов), что, я думаю, не то, что вы хотели.

Похоже, вы просто хотели получить подматрицу , состоящую из первого столбца x1. Это было бы

w - x1[:, [0]] 

возвращение

array([[ 0.], 
     [ 1.], 
     [ 1.]]) 

согласуется с другим результатом.

В случае разреженной матрицы вы автоматически получаете подматрицу (а не 1D-массив), потому что индексация работает по-разному для них.

+0

w - x1 [:, [0]] решает мою проблему, спасибо! – Shockley

2

Это потому, что эти ломтики 1D и 2D соответственно -

In [23]: x1[:,0] 
Out[23]: array([ 1., 0., 0.]) 

In [24]: x2[:,0].toarray() 
Out[24]: 
array([[ 1.], 
     [ 0.], 
     [ 0.]]) 

In [29]: x1[:,0].ndim 
Out[29]: 1 

In [30]: x2[:,0].toarray().ndim 
Out[30]: 2 

Кроме того, w является 2D массива -

In [33]: w 
Out[33]: 
array([[ 1.], 
     [ 1.], 
     [ 1.]]) 

In [34]: w.ndim 
Out[34]: 2 

Так, с broadcasting вычитаниями из w выполняется вдоль различных осей w, а именно вторая и первая оси соответственно.