在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.max
,y.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.sum
是y
轉換爲陣列(和任選地回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
,但它表明程序環境更復雜。儘可能使用最簡單的程序進行計算。
你在ndarray中傳入什麼類型的數據,'y'? – 2015-01-04 15:13:02
y是浮點矩陣 – AC11 2015-01-04 15:18:20
'type(y)'給出了什麼? – sebix 2015-01-04 15:57:04