【问题标题】:How do I create an empty array/matrix in NumPy?如何在 NumPy 中创建一个空数组/矩阵?
【发布时间】:2010-10-08 19:28:34
【问题描述】:

我不知道如何以通常使用列表的方式使用数组或矩阵。我想创建一个空数组(或矩阵),然后一次添加一列(或行)。

目前我能找到的唯一方法是:

mat = None
for col in columns:
    if mat is None:
        mat = col
    else:
        mat = hstack((mat, col))

如果它是一个列表,我会这样做:

list = []
for item in data:
    list.append(item)

有没有办法为NumPy 数组或矩阵使用这种表示法?

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    要创建一个空的 NumPy 数组而不定义其形状,您可以执行以下操作:

    arr = np.array([])
    

    首选第一个,因为您知道您将使用它作为 NumPy 数组。 NumPy 之后将其转换为 np.ndarray 类型,无需额外的 [] 'dimension'。

    为了向数组添加新元素,我们可以这样做:

    arr = np.append(arr, 'new element')
    

    请注意,在 python 的背景中,没有数组这样的东西 定义它的形状。正如@hpaulj 提到的,这也是一个排名 数组。

    【讨论】:

    • 不,np.array([]) 创建一个形状为 (0,) 的数组,一个包含 0 个元素的一维数组。没有定义形状的数组是不存在的。并且 2) 与 1) 做同样的事情。
    • 这是真的@hpaulj,尽管讨论的重点是在创建形状时不要在心里考虑形状。无论如何都值得一提。
    【解决方案2】:

    最简单的方法

    输入:

    import numpy as np
    data = np.zeros((0, 0), dtype=float)   # (rows,cols)
    data.shape
    

    输出:
    (0, 0)

    输入:

    for i in range(n_files):
         data = np.append(data, new_data, axis = 0)
    

    【讨论】:

      【解决方案3】:

      另一种创建可以带数组的空数组的简单方法是:

      import numpy as np
      np.empty((2,3), dtype=object)
      

      【讨论】:

        【解决方案4】:

        您对有效使用 NumPy 的心智模型有误。 NumPy 数组存储在连续的内存块中。如果要向现有数组添加行或列,则需要将整个数组复制到新的内存块中,从而为要存储的新元素创建间隙。如果重复构建数组,这是非常低效的。

        在添加行的情况下,最好的办法是创建一个与数据集最终一样大的数组,然后逐行为其分配数据:

        >>> import numpy
        >>> a = numpy.zeros(shape=(5,2))
        >>> a
        array([[ 0.,  0.],
           [ 0.,  0.],
           [ 0.,  0.],
           [ 0.,  0.],
           [ 0.,  0.]])
        >>> a[0] = [1,2]
        >>> a[1] = [2,3]
        >>> a
        array([[ 1.,  2.],
           [ 2.,  3.],
           [ 0.,  0.],
           [ 0.,  0.],
           [ 0.,  0.]])
        

        【讨论】:

        • 如果您不需要将数组归零,还有 numpy.empty()。
        • 使用 empty() 比 zeros() 有什么好处?
        • 如果您要立即使用数据对其进行初始化,则可以节省归零的成本。
        • @maracorossi 所以.empty() 意味着可以在单元格中找到随机值,但数组的创建速度比例如更快。 .zeros() ?
        • @user3085931 是的!
        【解决方案5】:

        也许你正在寻找的是这样的:

        x=np.array(0)
        

        通过这种方式,您可以创建一个没有任何元素的数组。它类似于:

        x=[]
        

        这样您就可以提前将新元素附加到您的数组中。

        【讨论】:

        • 不,您的 x 是一个具有形状 () 和一个元素的数组。它更像0 而不是[]。你可以称它为“标量数组”。
        【解决方案6】:

        这里有一些解决方法可以让 numpys 看起来更像列表

        np_arr = np.array([])
        np_arr = np.append(np_arr , 2)
        np_arr = np.append(np_arr , 24)
        print(np_arr)
        

        输出:数组([2., 24.])

        【讨论】:

        • 远离np.append。尽管名称选择不当,但它不是列表追加克隆。
        【解决方案7】:

        我认为您可以创建空的 numpy 数组,例如:

        >>> import numpy as np
        >>> empty_array= np.zeros(0)
        >>> empty_array
        array([], dtype=float64)
        >>> empty_array.shape
        (0,)
        

        当您想在循环中附加 numpy 数组时,此格式很有用。

        【讨论】:

          【解决方案8】:

          我认为您希望使用列表处理大部分工作,然后将结果用作矩阵。也许这是一种方式;

          ur_list = []
          for col in columns:
              ur_list.append(list(col))
          
          mat = np.matrix(ur_list)
          

          【讨论】:

            【解决方案9】:

            在 NumPy 中创建一个空的多维数组(例如,一个二维数组 m*n 来存储您的矩阵),以防您不知道 m 将追加多少行并且不关心计算成本Stephen Simmons 提到(即在每次追加时重新构建数组),您可以将要追加到的维度压缩到 0:X = np.empty(shape=[0, n])

            例如,您可以使用这种方式(这里是m = 5,我们假设我们在创建空矩阵时不知道,n = 2):

            import numpy as np
            
            n = 2
            X = np.empty(shape=[0, n])
            
            for i in range(5):
                for j  in range(2):
                    X = np.append(X, [[i, j]], axis=0)
            
            print X
            

            这会给你:

            [[ 0.  0.]
             [ 0.  1.]
             [ 1.  0.]
             [ 1.  1.]
             [ 2.  0.]
             [ 2.  1.]
             [ 3.  0.]
             [ 3.  1.]
             [ 4.  0.]
             [ 4.  1.]]
            

            【讨论】:

            • 这应该是OP问的问题的答案,对于你事先不知道#rows的用例,或者想要处理有0行的情况
            • 虽然这确实按照 OP 的要求工作,但这不是一个好的答案。如果你知道迭代范围,你就知道目标数组的大小。
            • 但是当然有很多例子你不知道迭代范围并且你不关心计算成本。在这种情况下很好的答案!
            【解决方案10】:

            根据您的用途,您可能需要指定数据类型(请参阅'dtype')。

            例如,要创建一个 8 位值的二维数组(适合用作单色图像):

            myarray = numpy.empty(shape=(H,W),dtype='u1')
            

            对于 RGB 图像,在形状中包含颜色通道数:shape=(H,W,3)

            您可能还想考虑使用numpy.zeros 进行零初始化,而不是使用numpy.empty。请参阅注释here

            【讨论】:

              【解决方案11】:

              我对此进行了很多研究,因为我需要在我的一个学校项目中使用 numpy.array 作为一个集合,并且我需要初始化为空......我在 Stack Overflow 上没有找到任何相关答案,所以我开始涂鸦。

              # Initialize your variable as an empty list first
              In [32]: x=[]
              # and now cast it as a numpy ndarray
              In [33]: x=np.array(x)
              

              结果将是:

              In [34]: x
              Out[34]: array([], dtype=float64)
              

              因此可以直接初始化一个np数组,如下:

              In [36]: x= np.array([], dtype=np.float64)
              

              我希望这会有所帮助。

              【讨论】:

              • 这对数组不起作用,就像问题一样,但它对向量很有用。
              • a=np.array([]) 似乎默认为 float64
              【解决方案12】:

              您可以应用它来构建任何类型的数组,例如零:

              a = range(5)
              a = [i*0 for i in a]
              print a 
              [0, 0, 0, 0, 0]
              

              【讨论】:

              • 如果你想在纯 python 中做到这一点,a= [0] * 5 是简单的解决方案
              【解决方案13】:

              您可以使用附加功能。对于行:

              >>> from numpy import *
              >>> a = array([10,20,30])
              >>> append(a, [[1,2,3]], axis=0)
              array([[10, 20, 30],      
                     [1, 2, 3]])
              

              对于列:

              >>> append(a, [[15],[15]], axis=1)
              array([[10, 20, 30, 15],      
                     [1, 2, 3, 15]])
              

              编辑
              当然,正如其他答案中所提到的,除非您每次都在矩阵/数组上进行一些处理(例如反转),否则我只会创建一个列表,附加到它然后将其转换为数组.

              【讨论】:

              • 这如何回答这个问题?我没有看到关于空数组的部分
              【解决方案14】:

              如果你完全不知道数组的最终大小,你可以像这样增加数组的大小:

              my_arr = numpy.zeros((0,5))
              for i in range(3):
                  my_arr=numpy.concatenate( ( my_arr, numpy.ones((1,5)) ) )
              print(my_arr)
              
              [[ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]]
              
              • 请注意第一行中的0
              • numpy.append 是另一种选择。它调用numpy.concatenate

              【讨论】:

                【解决方案15】:

                NumPy 数组是与列表非常不同的数据结构,旨在以不同的方式使用。您对hstack 的使用可能非常低效......每次调用它时,现有数组中的所有数据都会被复制到一个新数组中。 (append 函数也有同样的问题。)如果您想一次建立一列矩阵,最好将其保留在列表中,直到完成,然后才将其转换为数组。

                例如

                
                mylist = []
                for item in data:
                    mylist.append(item)
                mat = numpy.array(mylist)
                

                item 可以是列表、数组或任何可迭代对象,只要 因为每个 item 具有相同数量的元素。
                在这种特殊情况下(data 是一些可迭代的保存矩阵列),您可以简单地使用

                
                mat = numpy.array(data)
                

                (另请注意,使用list 作为变量名可能不是一个好习惯,因为它会用该名称掩盖内置类型,这可能会导致错误。)

                编辑:

                如果出于某种原因你真的想创建一个空数组,你可以使用 numpy.array([]),但这很少有用!

                【讨论】:

                • numpy 数组/矩阵与 Matlab 有根本的不同吗?
                • 如果由于某种原因您需要定义一个空数组,但具有固定宽度(例如np.concatenate()),您可以使用:np.empty((0, some_width))。 0,所以你的第一个数组不会是垃圾。
                猜你喜欢
                • 2017-03-04
                • 2020-09-07
                • 2021-01-09
                • 2014-03-02
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多