2015-01-04 152 views
0

我得到python中最奇怪的屬性錯誤,我似乎無法找到任何關於它的在線。 我想總結一個矩陣y的所有列的元素,並將它們保存在一個新的矩陣中。 y是1和0的1063×1063單位矩陣。 墊是70000 X 1063稀疏矩陣Python numpy屬性錯誤'_collapse'

mat = scipy.sparse.rand(70000, 1063, density=0.01, format='coo', dtype=None, random_state=None) 
mat.shape 

給我:

(70000, 1063) 

現在我創建Y,一個1063 X 1063矩陣:

y = np.matlib.identity(1063) 
ind = np.nonzero((mat.sum(axis=0) < 20)) 
y[ind, :] = 0     # replace element at given index with 0 

x = np.sum(y, axis=1)   # here i want to count the elements of all columns of y 

我正在以下關於最後一行的錯誤:

AttributeError: 'numpy.ndarray' object has no attribute '_collapse' 

我迷路了。有關如何解決這個問題的任何想法?

+0

你在ndarray中傳入什麼類型的數據,'y'? – 2015-01-04 15:13:02

+0

y是浮點矩陣 – AC11 2015-01-04 15:18:20

+0

'type(y)'給出了什麼? – sebix 2015-01-04 15:57:04

回答

3

matrixlib/defmtrix.py_collapse被定義爲Matrix類的方法:

def _collapse(self, axis): 
    """A convenience function for operations that want to collapse 
    to a scalar like _align, but are using keepdims=True 
    """ 
    if axis is None: 
     return self[0, 0] 
    else: 
     return self 

_collapse正在被使用:

def sum(self, axis=None, dtype=None, out=None): 
    return N.ndarray.sum(self, axis, dtype, out, keepdims=True)._collapse(axis) 

它也可用於這樣的方法等.mean.prod.any.max。基本上任何通常會減少矩陣尺寸的操作。

通常這些操作返回一個與輸入相同類型的數組,所以如果y是一個矩陣,它應該返回一個矩陣。由於矩陣總是2d,因此使用keepdims=True。在操作將矩陣縮減爲標量的情況下(例如,軸爲無),需要._collapse。然後我們需要一個真正的標量,而不是一個包裹在矩陣中的標量。

我懷疑這部分代碼是否在幾年內發生了變化(我會仔細檢查github)。


所以它是一個matrix定義,但不是ndarray

In [154]: np.matrix([[1,0],[0,1]])._collapse(0) 
Out[154]: 
matrix([[1, 0], 
     [0, 1]]) 

In [155]: np.array([[1,0],[0,1]])._collapse(0) 
... 
AttributeError: 'numpy.ndarray' object has no attribute '_collapse' 

看起來好像np.sum未返回matrix即使輸入是一個。


不知其他還原函數具有相同的問題,例如

y.max(axis=0) 
np.add.reduce(y, axis=0) 

y.maxy.prod,等都是編碼相同y.sum。對於matrix這意味着使用底層的ndarray函數,然後使用._collapse

np.add.reduce(y, axis=1, keepdims=True)在功能上非常相似,儘管到底層C代碼的路由是不同的。它不會試圖呼叫._collapse,這意味着對於axis=None它不會將結果減少爲標量;它剩下一個(1,1)矩陣。 ._collapse仍然在被使用,如:

np.add.reduce(np.matrix('1 2 3; 4 5 6'),axis=None, keepdims=True)._collapse(None) 
# 21 

周圍的問題的另一種選擇用np.sumy轉換爲陣列(和任選地回matrix):

np.matrix(np.sum(y.A, axis=1, keepdims=True)) 

sparse另需路線.sum - 將矩陣乘以1的矩陣:

y * np.asmatrix(np.ones((y.shape[1],1),int)) 

我在想,如果你的問題是由你正在導入的其他模塊引起的,那麼這個模塊會覆蓋一些定義,比如matrix。你有一個pandas標籤。這是否意味着您加載pandas作爲此計算的一部分?我並不是指責pandas,但它表明程序環境更復雜。儘可能使用最簡單的程序進行計算。

+0

感謝您的回答。我試過x = y.sum(axis = 1),並再次得到相同的錯誤。所以你說這可能是因爲y是一個矩陣,我試着對它進行一個ndarray操作? – AC11 2015-01-05 11:00:44

+0

如果'y'是數組,則'sum'的'matrix'版本將不會被調用,並且不會嘗試調用'._collapse'。 'np.matrix([])。sum(0)'如何表現? – hpaulj 2015-01-05 17:17:28

+0

'np.prod(y,axis = 1)'是否給出相同的錯誤? (或其他任何「減少」方法)? – hpaulj 2015-01-06 01:48:05