【问题标题】:Initialize empty matrix in Python在 Python 中初始化空矩阵
【发布时间】:2013-08-29 05:43:21
【问题描述】:

我正在尝试在 Python 中转换 MATLAB 代码。我不知道如何在 Python 中初始化空矩阵。

MATLAB 代码:

demod4(1) = [];

我在 Python 中尝试过

demod4[0] = array([])

但它给出了错误:

only length-1 arrays can be converted to Python scalars

【问题讨论】:

  • 您将不得不分享更多关于您的对象demod4 和您的导入的信息。但是,有两个选项,numpy.emptynumpy.zeros 分别初始化给定大小的空数组或零数组。
  • 空的意思是size == 0
  • 您的 MATLAB 代码示例不会初始化一个空数组,但会删除索引元素 1(并因此向量化您的 demod4 矩阵)。对于空矩阵,您需要demod4=[]

标签: python matlab numpy


【解决方案1】:

如果您使用numpy arrays,则通过指定预期的矩阵大小来初始化为0:

import numpy as np
d = np.zeros((2,3))

>>> d
    [[ 0.  0.  0.]
     [ 0.  0.  0.]]

这相当于 MATLAB 的:

d = zeros(2,3);

您还可以初始化一个空数组,再次使用预期的尺寸/大小

d = np.empty((2,3))

如果您不使用 numpy,则最接近 MATLAB 的 d = [](即零大小矩阵)将使用空列表,然后

附加值(用于填充向量)

d = []
d.append(0)
d.append(1)
>>> d                                                                     
[0, 1]

或附加列表(用于填充矩阵行或列):

d = []                                                                
d.append(range(0,2))                                                    
d.append(range(2,4))                                                  
>>> d                                                                     
[[0, 1], [2, 3]]

另见:

initialize a numpy array (SO)

NumPy array initialization (fill with identical values) (SO)

How do I create an empty array/matrix in NumPy? (SO)

NumPy for MATLAB users

【讨论】:

    【解决方案2】:

    您可以使用嵌套列表推导:

    # size of matrix n x m
    matrix = [ [ 0 for i in range(n) ] for j in range(m) ]
    

    【讨论】:

    • 尺寸应该是 m x n,而不是 n x m。
    【解决方案3】:

    如何初始化一个列表,填充它,然后转换为一个数组。

    demod4 = []  
    

    或者,您可以在初始化时使用列表推导进行填充

    demod4 = [[func(i, j) for j in range(M)] for i in range(N)]
    

    或者,如果您提前知道数组的大小,您可以初始化一个全为零的数组。

    demod4 = [[0 for j in range(M)] for i in range(N)]
    

    demod4 = [[0 for i in range(M)]*N]
    

    或者尝试使用numpy

    import numpy as np
    
    N, M = 100, 5000
    np.zeros((N, M))
    

    【讨论】:

    • demod4 给出1x(M+N) 数组而不是矩阵。
    【解决方案4】:

    要初始化 M 行 N 列的矩阵,您可以使用以下模式:

    M = 3
    N = 2
    matrix = [[0] * N for _ in range(M)]
    

    【讨论】:

      【解决方案5】:

      如果你想用 0 初始化矩阵,那么使用下面的代码

      # for m*n matrix
      matrix = [[0] * m for i in range(n)]
      

      【讨论】:

        【解决方案6】:
        M=[]
        n=int(input())
        m=int(input())
        for j in range(n):
           l=[]
           for k in range(m):
               l.append(0)
           M.append(l)
        print(M)
        

        这是执行矩阵[m,n]的传统方式,但是,如其他答案中所述,python提供了许多很酷的方式。

        【讨论】:

          【解决方案7】:

          我发现这种方法是创建矩阵的简单方法

              rows = 3
              columns = 4
              matrix = [[0] * columns] * rows
          

          我的输出:


              [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
          

          如果你想打印矩阵使用这个:

              for i in range(rows):
                   for j in range(columns):
                       print(matrix[i][j], end=' ')
                   print()
          

          我的输出:

             0 0 0 0 
             0 0 0 0 
             0 0 0 0 
          

          【讨论】:

          • 小心,这会产生一堆别名:你所有的行都是同一个向量。例如,matrix[1][2]=1 然后print(matrix) 将输出[[0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0]],这肯定不是你想要的。
          • 上面的其他解决方案,其中一些使用理解来获取所有行,可能看起来更长,但它们避免了这个行别名问题。
          【解决方案8】:
          rows = 3
          columns = 2
          M = [[0]*columns]*rows
          

          或者你也可以使用 '' 代替 0

          print(M)
          

          输出:

          M = [[0, 0], [0, 0], [0, 0]] 
          

          【讨论】:

          • 这段代码的作用是为同一行创建三个引用。因此,现在如果您更改 Matrix 中的任何值,所有行都将具有相同的值。例如 M[0][0] = 10,你会得到 M = [[10, 0], [10, 0], [10, 0]]。因此,您需要使用上面提供的列表理解。但是,我建议使用 numpy。
          猜你喜欢
          • 2020-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多