2015-04-19 262 views
0

我想創造這個矩陣:NumPy的 - 創建矩陣

[[ 1. 1. 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 1. 1. 1. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 1. 1. 1. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 1. 1. 1. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 1. 1. 1. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 1. 1. 1. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 1. 1. 1. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 1. 1. 1. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.] 
[ 0. 0. 0. 0. 0. 0. 0. 0. 1. 1.]] 

我可以很容易地通過做

import numpy as np 
matrix = np.eye((10)) 
+5

聞起來像莫名其妙功課? – DominikAngerer

+1

爲什麼要特別使用'for'循環? 'numpy'通常可以避免顯式循環。 – jonrsharpe

回答

1

得到單位矩陣可以使用的eyek參數設定的指標對角:

>>> m1= np.eye((10)) 
>>> m2= np.eye((10),k=1) 
>>> m3 = np.eye((10),k=-1) 
>>> m1+m2+m3 
array([[ 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 1., 1., 1., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 1., 1., 1., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 1., 1., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 1., 1., 1., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 1., 1., 1., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 1., 1., 1., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 1., 1., 1.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 1., 1.]]) 

或者:

>>> np.triu(np.tril(np.ones((10,10)),k=1),k=-1) 
array([[ 1., 1., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 1., 1., 1., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 1., 1., 1., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 1., 1., 1., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 1., 1., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 1., 1., 1., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 1., 1., 1., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 1., 1., 1., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 1., 1., 1.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 1., 1.]]) 
+0

我喜歡聽到投票的原因! – Kasramvd

+0

我認爲你因爲OP要求循環而下降了。不知道他爲什麼要這樣做。 – JuniorCompressor

+1

@JuniorCompressor它沒有一個很好的理由,因爲,mayhap OP認爲它是唯一的方法! – Kasramvd

0

自己試試

n = 10 
[[1. if (row == 0 and col in (0, 1)) or 
     (row == n-1 and col in (n-2, n-1)) or 
     (row not in (0, n-1) and col in (row-1, row, row+1)) 
    else 0. for col in range(n)] for row in range(n)] 
0

與非標準Python庫元素,這個問題是可以解決的,因爲這:

疊代矩陣(子列表的列表)。

  1. 用於第一行(第一列表)翻轉第二元件爲1。
  2. 最後行翻轉元件。
  3. 最後一個1
  4. 其餘的行。
  5. 找到1的索引並將其賦值。
  6. 翻轉右邊的元素和基質留給1.

    爲行:

    if row == matrix[0]: 
        row[1]=1 
    
    elif row == matrix[len(matrix)-1]: 
        row[len(row)-2] = 1 
    
    else: 
        p= row.index(1) 
        row[p-1], row[p+1] = 1,1 
    
+1

我認爲包含一些書面描述或對代碼的解釋總是很好的做法。 – Totem