【问题标题】:defining the i,j th entry of a matrix in loop在循环中定义矩阵的第 i,j 个条目
【发布时间】:2017-12-17 21:30:19
【问题描述】:

假设我想定义一个 n x m 矩阵,其第 i,j 个条目是 i+j。如何指定我想要第 i,j 个条目是什么?在“for”循环中,它不允许我说,例如,A[i,j]=i+j。我该怎么做?

【问题讨论】:

  • 最简单的方法是列表理解[[i+j for j in range(m)] for i in range(n)]
  • 谢谢,但我也想知道如何更改现有矩阵的第 i,j 个条目。
  • 嵌套列表的“数组”由每个括号一个索引索引:A[i][j]
  • 您应该能够在 numpy 数组上执行 a[i, j] = i+j。你能分享一下不起作用的代码吗?

标签: python numpy for-loop matrix


【解决方案1】:

numpy 中,您原则上可以创建一个空数组:

import numpy as np

m, n = 3, 5
A = np.empty(shape=(m, n), dtype=int)

然后使用循环填充它:

for i in range(m):
    for j in range(n):
        A[i, j] = i+j

但是,这不是推荐的方式。更好地避免循环并利用矢量化:创建网格

i, j = np.ogrid[:m, :n]

并在一次操作中创建您的数组

A = i+j

在简单添加索引的特殊情况下,您可以做得更短:

A = np.add.outer(range(m), range(n))

【讨论】:

    【解决方案2】:

    如果您的矩阵已经创建,因此在行 i 和列 j 中已经存在一个项目,您可以修改该项目

    A[i][j] = newvalue
    

    这适用于 Python 内置的各种“矩阵”,例如列表或数组。请注意,这意味着矩阵中的每一行都是整个列表中的一项,因此“矩阵”实际上是列表的列表。

    在其他模块中添加的一些其他类型,例如numpy,也允许其他方法。

    【讨论】:

      【解决方案3】:

      既然你已经标记了这个 numpy 并且因为 numpy 是在 python 中处理大型数组和数学的正确方法:

      >>> import numpy as np
      >>> i = 3; j = 4
      >>> np.arange(i)[:,None] + np.arange(j)[None,:]
      array([[0, 1, 2, 3],
             [1, 2, 3, 4],
             [2, 3, 4, 5]])
      

      更改现有数组

      让我们创建一个数组:

      >>> arr = np.zeros((3,4))
      >>> arr
      array([[ 0.,  0.,  0.,  0.],
             [ 0.,  0.,  0.,  0.],
             [ 0.,  0.,  0.,  0.]])
      

      现在,让我们更改一个条目:

      >>> arr[1,2] = 1+2
      >>> arr
      array([[ 0.,  0.,  0.,  0.],
             [ 0.,  0.,  3.,  0.],
             [ 0.,  0.,  0.,  0.]])
      

      【讨论】:

      • 谢谢,但我也想知道如何更改现有矩阵的第 i,j 个条目
      • @weedanorse 查看更新以更改现有矩阵中的条目。
      【解决方案4】:

      您可以使用 np.fromfunction 定义一个array,其中[i, j] == i + j

      >>> np.fromfunction(lambda i, j: i+j, (5, 5))
      array([[ 0.,  1.,  2.,  3.,  4.],
             [ 1.,  2.,  3.,  4.,  5.],
             [ 2.,  3.,  4.,  5.,  6.],
             [ 3.,  4.,  5.,  6.,  7.],
             [ 4.,  5.,  6.,  7.,  8.]])
      

      要更改位置[i, j] 的元素,则只需index 并更改其值:

      >>> a = np.fromfunction(lambda i, j: i+j, (5, 5))
      >>> a[1, 2] = 99
      >>> a
      array([[  0.,   1.,   2.,   3.,   4.],
             [  1.,   2.,  99.,   4.,   5.],
             [  2.,   3.,   4.,   5.,   6.],
             [  3.,   4.,   5.,   6.,   7.],
             [  4.,   5.,   6.,   7.,   8.]])
      

      【讨论】:

        【解决方案5】:

        简单的单行:

        arr = [[0, 0, 0, 0], 
               [0, 0, 0, 0],      
               [0, 0, 0, 0]] 
        
        arr = [[i+j for j in range(4)] for i in range(3)]
        

        输出:

        arr => [
        [0, 1, 2, 3], 
        [1, 2, 3, 4], 
        [2, 3, 4, 5]]
        

        这会改变原始数组。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多