【问题标题】:Generate matrix np python生成矩阵 np python
【发布时间】:2021-01-07 22:57:50
【问题描述】:

我需要编写一个函数来生成下面的矩阵。

我写了这段代码:

def second_composition(n, m):
    upper_triangle = np.triu_indices(n, 1)
    ones = np.ones((n, m))
    ones[upper_triangle] = -1

    return ones


n = 6
m = 6

result_second_composition = second_composition(n, m)

print(result_second_composition)

这是输出:

【问题讨论】:

  • 你的代码的输出是什么,你的输出有什么问题?
  • @Jeff 我在问题中添加了输出。
  • 请发布文字,而不是图片。见How to Ask
  • 您的指令显示方阵,但您正在处理非方阵。这两个输入有什么作用?

标签: python arrays numpy matrix


【解决方案1】:

只需在axis=0 旁边添加np.cumsum -

def second_composition(n, m):
    upper_triangle = np.triu_indices(n, 1)
    ones = np.cumsum(np.ones((n, m)), axis=0) #<----
    ones[upper_triangle] = -1

    return ones

second_composition(5,5)
array([[ 1., -1., -1., -1., -1.],
       [ 2.,  2., -1., -1., -1.],
       [ 3.,  3.,  3., -1., -1.],
       [ 4.,  4.,  4.,  4., -1.],
       [ 5.,  5.,  5.,  5.,  5.]])

另一种方法是使用triu(k=1) + tril()。 k=1 是上矩阵的对角线。

def compose(n,m):
    ones = np.ones((n,m))
    out = np.tril(np.cumsum(ones,0)) + -1*np.triu(ones,k=1)
    return out

compose(6,6)
array([[ 1., -1., -1., -1., -1., -1.],
       [ 2.,  2., -1., -1., -1., -1.],
       [ 3.,  3.,  3., -1., -1., -1.],
       [ 4.,  4.,  4.,  4., -1., -1.],
       [ 5.,  5.,  5.,  5.,  5., -1.],
       [ 6.,  6.,  6.,  6.,  6.,  6.]])

【讨论】:

  • 添加了另一种稍微整洁的方法。如果它解决了您的问题,请将答案标记为正确。谢谢!
  • 我添加了一个可以说更整洁的方法:)
【解决方案2】:

看看tril_indices 为行索引返回什么:基本上就是你想要的矩阵下半部分:

def second_composition(n):
    m = np.ones((n, n))
    r, c = np.tril_indices(n)
    m[r, c] = r + 1
    return m

【讨论】:

    【解决方案3】:

    假设它必须是 m == n 的方阵,请将以下内容添加到您的定义中

    lower_triangle = np.tril_indices(m,)
        ones[upper_triangle] = -1
        for i, j in zip(lower_triangle[0], lower_triangle[1]):
            ones[i][j] = i+1
    

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2013-05-06
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多