2014-04-26 70 views
1

我有從轉換numpy的矩陣生成的嵌套列表列出嵌套列表中的每個值:加快嵌套循環操作

[ 
    [0.65, 0.66, 4.29, 2.91, 0.17, 3.92, 2.24, 0.56, 8.99, 0.34, 0.0], 
    [0.012, 0.038, 0.072, 0.236, 0.012, 0.258, 0.075, 0.003, 0.0, 0.002, 0.0], 
    [0.003, 0.039, 0.138, 0.02, 0.002, 0.32, 0.013, 0.001, 0.999, 0.0, 0.0], 
    [0.154, 0.043, 0.737, 0.475, 0.028, 0.002, 0.485, 0.145, 0.0, 0.035, 0.0], 
    [0.018, 0.0, 0.019, 0.175, 0.01, 0.0, 0.065, 0.0, 0.0, 0.0, 0.0], 
    [0.0801, 0.0, 0.6707, 0.1496, 0.0112, 0.0, 0.2668, 0.0798, 0.0, 0.0385, 0.0], 
    [118.0, 88.0, 120.0, 186.0, 220.0, 146.0, 157.0, 150.0, 50.0, 50.0, 0.0], 
    [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
    [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0], 
    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0] 
] 

我目前通過每一個元素循環執行以下操作:

A1 = A.tolist() 

for index, v in enumerate(A1): 
    for index2, v2 in enumerate(v): 
     A1[index][index2] = float(v2 + offsets[index])/norms[index] * priorita[index] 

A1 = np.matrix(A1) 

由於此操作執行超過3.000.000次,這是我的應用程序的瓶頸。

  1. 是否有任何本地方法的numpy,可以幫助我的表演?
  2. 像地圖替換枚舉可以幫助我的表演嗎?

請提供示例和文檔鏈接。

謝謝。

+0

好奇:你爲什麼把它列入清單?將它作爲NumPy數組將允許您使用矢量化操作,並且所有相同的索引仍然可以工作。 – nneonneo

+0

否則,我得到以下錯誤:TypeError:只能將長度爲1的數組轉換爲Python標量 –

+0

然後,您應該嘗試找出代碼不工作的原因。絕對不值得轉換到Python列表來進行計算,特別是如果您以後只需轉換回數組。 – nneonneo

回答

2

在下面的假設下,這應該給你相同的結果。

A1 = (A1+offsets)*(priorita/norms) 

假設:

  1. A1:n * m個矩陣
  2. offsets:N * 1向量
  3. norms:N * 1向量
  4. priorita:N * 1向量
  5. 這些都是numpy.array
+0

所有的假設都是正確的。在我的測試案例中,n = 18和m = 11。我使用了'A1 =(A +偏移量)*(priorita/norms)',但是我得到了ValueError:操作數不能與形狀一起廣播(18,11) 18) –

+0

一切都必須轉換爲'numpy.ndarray'格式。例如,如果你做'norms.shape',你應該得到'(18,1)'。 – ysakamoto

+0

偉大的,現在偏移量。形狀,norm.shapes和priorita.shape都返回(18,1)和A1.shape返回(18,11)。不過,我現在在包含'A1 =(A1 + offset)*(priorita/norms)' –