2014-03-07 69 views
1

一個簡單的例子,我有以下幾點:值複製到其他依賴於布爾面具

import numpy as np 
a = np.matrix([[0.34, 0.44, 0.21, 0.51]]) 
a_max = np.matrix([[0.35, 0.40, 0.20, 0.50]]) 

我想申請一個變換,其中的任何東西,大於a_max,上限爲a_max。我試圖通過這樣做:

a[a>a_max] = a_max[a>a_max] 

然而,這將引發一個錯誤:

ValueError: array is not broadcastable to correct shape 

什麼是做到這一點的正確方法?忽略我正在做一個簡單的最大限度的事實(我猜測顛簸可能有內建工具來做這個特定的問題)。我真正的問題是使用一組更復雜的布爾值來創建布爾掩碼,然後應該替換替換矩陣中的值。

+2

你執着於與矩陣的工作,或將陣列足夠? (請記住,如果你堅持,你總是可以轉換回來。) – DSM

+0

我更喜歡矩陣,因爲我在矩陣上做了相當多的矩陣數學/線性代數。我想我可以在裝配後進行轉換。 – MarkD

回答

3

生命的,如果你使用數組,而不是矩陣工作輕鬆多了;它只是工作(tm)。

>>> a = np.array([[0.34, 0.44, 0.21, 0.51]]) 
>>> a_max = np.array([[0.35, 0.40, 0.20, 0.50]]) 
>>> a[a > a_max] = a_max[a > a_max] 
>>> a 
array([[ 0.34, 0.4 , 0.2 , 0.5 ]]) 

我想你可以使用np.where,雖然:

>>> a = np.matrix([[0.34, 0.44, 0.21, 0.51]]) 
>>> a_max = np.matrix([[0.35, 0.40, 0.20, 0.50]]) 
>>> np.where(a > a_max, a_max, a) 
matrix([[ 0.34, 0.4 , 0.2 , 0.5 ]]) 
>>> 
+0

對於'np.where' +1 ...仍然不確定OP的錯誤是否被拋出。奇怪的矩陣廣播規則? – mdscruggs

+1

我在trunk numpy中得到的錯誤說明它好一點:「TypeError:NumPy布爾數組索引賦值需要0或1維輸入,輸入有2維」。矩陣式的尺寸變化相當困難。 – DSM

+0

感謝帝斯曼。 np.where工作得很好。 – MarkD

0

minimum功能似乎足夠了:

a = np.matrix([[999, 0.1, 0.1, 999]]) 
a_max = np.matrix([[1, 2, 3, 4]]) 
a_capped = np.minimum(a, a_max) 

print repr(a_capped) # the printed result of matrix.__str__ is weird to me 

打印:

matrix([[1. , 0.1, 0.1, 4. ]]) 

http://docs.scipy.org/doc/numpy/reference/generated/numpy.minimum.html

+0

查看我的評論的最後一部分:忽略我正在做一個簡單的最大值(我猜numpy可能有內置工具來做這個特定的問題)。我真正的問題是使用一組更復雜的布爾值來創建布爾掩碼,然後應該替換替換矩陣中的值。換句話說,它不只是採取最小或最大。我在其他地方構建了一個掩模布爾矩陣(與簡單的上限無關),我需要使用它來確定替換矩陣中的哪些值通過。 – MarkD

+0

啊,我明白你的意思了......我的壞話。我將不得不考慮一點點,顯然... – mdscruggs