【问题标题】:Numpy - creating matrix [closed]Numpy - 创建矩阵
【发布时间】:2015-04-19 20:50:48
【问题描述】:

我想创建这个矩阵:

[[ 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))

【问题讨论】:

  • 有点像家庭作业的味道?
  • 为什么要特别使用for循环? numpy 通常有利于避免显式循环。

标签: python loops for-loop numpy matrix


【解决方案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.]])

【讨论】:

  • 我想听听投反对票的原因!
  • 我认为你被否决了,因为 OP 要求循环。不知道他为什么想要它。
  • @JuniorCompressor 这根本不是投反对票的好理由,因为,也许 OP 认为这是唯一的方法!
  • 我同意...谁知道他为什么这么问
【解决方案2】:

把自己搞砸

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)]

【讨论】:

    【解决方案3】:

    使用标准的python库元素,问题可以这样解决:

    遍历矩阵(子列表列表)。

    1. 对于第一行(第一个列表),将第二个元素翻转为 1。
    2. 为最后一行翻转元素。
    3. 在最后一个到 1 之前
    4. 用于其余行。
    5. 找到 1 的索引并将其分配给 value。
    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
      

    【讨论】:

    • 我认为在你的代码中加入一些书面描述或解释总是好的做法。
    猜你喜欢
    • 1970-01-01
    • 2017-04-12
    • 2022-11-02
    • 2016-05-22
    • 2014-06-20
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多