首页 文章

初始化一个numpy数组

提问于
浏览
87

有没有办法初始化一个形状的numpy数组并添加到它?我将用列表示例解释我需要什么 . 如果我想创建一个循环中生成的对象列表,我可以这样做:

a = []
for i in range(5):
    a.append(i)

我想用numpy数组做类似的事情 . 我知道vstack,连接等等 . 但是,似乎这些需要两个numpy数组作为输入 . 我需要的是:

big_array # Initially empty. This is where I don't know what to specify
for i in range(5):
    array i of shape = (2,4) created.
    add to big_array

big_array 的形状应为 (10,4) . 这该怎么做?


EDIT:

我想补充以下说明 . 我知道我可以定义 big_array = numpy.zeros((10,4)) 然后填写它 . 但是,这需要提前指定big_array的大小 . 我知道这种情况下的大小,但如果我不知道怎么办?当我们使用 .append 函数在python中扩展列表时,我们不需要事先知道它的最终大小 . 我想知道是否有类似的东西从较小的数组创建一个更大的数组,从一个空数组开始 .

12 回答

  • 4

    numpy.zeros返回一个给定形状和类型的新数组,用零填充 .

    要么

    numpy.ones返回一个给定形状和类型的新数组,其中包含一个 .

    要么

    numpy.empty返回给定形状和类型的新数组,而不初始化条目 .


    但是,我们通过将元素附加到列表来构造数组的心态在numpy中使用不多,因为它效率较低(numpy数据类型更接近底层C数组) . 相反,您应该将数组预先分配到您需要的大小,然后填写行 . 但是,如果必须的话,可以使用 numpy.append .

  • 1

    我通常这样做的方法是创建一个常规列表,然后将我的东西添加到其中,最后将列表转换为numpy数组,如下所示:

    import numpy as np
    big_array = [] #  empty regular list
    for i in range(5):
        arr = i*np.ones((2,4)) # for instance
        big_array.append(arr)
    big_np_array = np.array(big_array)  # transformed to a numpy array
    

    当然,你的最终对象在创建步骤中占用内存空间的两倍,但是在python列表上追加非常快,并且使用np.array()创建也是如此 .

  • 5

    python的数组模拟

    a = []
    for i in range(5):
        a.append(i)
    

    是:

    import numpy as np
    
    a = np.empty((0))
    for i in range(5):
        a = np.append(a, i)
    
  • 5

    在numpy 1.8中引入:

    numpy.full返回一个给定形状和类型的新数组,填充fill_value .

    例子:

    >>> import numpy as np
    >>> np.full((2, 2), np.inf)
    array([[ inf,  inf],
           [ inf,  inf]])
    >>> np.full((2, 2), 10)
    array([[10, 10],
           [10, 10]])
    
  • 1

    numpy.fromiter() 正在寻找你:

    big_array = numpy.fromiter(xrange(5), dtype="int")
    

    它也适用于生成器表达式,例如:

    big_array = numpy.fromiter( (i*(i+1)/2 for i in xrange(5)), dtype="int" )
    

    如果您事先知道数组的长度,则可以使用可选的'count'参数指定它 .

  • 6

    在进行数组计算时,您确实希望尽可能避免显式循环,因为这会降低该计算形式的速度增益 . 有多种方法可以初始化numpy数组 . 如果你想要它填充零,请像katrielalex说:

    big_array = numpy.zeros((10,4))

    编辑:你正在制作什么样的序列?您应该检查创建数组的不同numpy函数,如 numpy.linspace(start, stop, size) (等间距数字)或 numpy.arange(start, stop, inc) . 在可能的情况下,这些函数将使数组比在显式循环中执行相同的工作快得多

  • 31

    对于您的第一个数组示例使用,

    a = numpy.arange(5)
    

    要初始化big_array,请使用

    big_array = numpy.zeros((10,4))
    

    这假设你想用零初始化,这很典型,但还有很多其他的ways to initialize an array in numpy .

    Edit: 如果您通常最好先使用追加来构建Python列表,并且当您在列表中收集了所有内容时,请使用 numpy.array(mylist) 将此列表转换为numpy数组 . 这样做的原因是列表意味着非常有效和快速地增长,而numpy.concatenate效率非常低,因为numpy数组不容易改变大小 . 但是一旦在列表中收集了所有内容,并且您知道最终的数组大小,就可以有效地构造一个numpy数组 .

  • 9

    我意识到这有点晚了,但我没有注意到任何其他答案提到索引到空数组:

    big_array = numpy.empty(10, 4)
    for i in range(5):
        array_i = numpy.random.random(2, 4)
        big_array[2 * i:2 * (i + 1), :] = array_i
    

    这样,您可以使用 numpy.empty 预分配整个结果数组,并使用索引赋值填充行 .

    在您给出的示例中预先分配 empty 而不是 zeros 是完全安全的,因为您保证整个数组将填充您生成的块 .

  • 0
    import numpy as np
    
    mat = np.array([[1, 1, 0, 0, 0],
                    [0, 1, 0, 0, 1],
                    [1, 0, 0, 1, 1],
                    [0, 0, 0, 0, 0],
                    [1, 0, 1, 0, 1]])
    
    print mat.shape
    print mat
    

    输出:

    (5, 5)
    [[1 1 0 0 0]
     [0 1 0 0 1]
     [1 0 0 1 1]
     [0 0 0 0 0]
     [1 0 1 0 1]]
    
  • 0

    我建议先定义形状 . 然后迭代它以插入值 .

    big_array= np.zeros(shape = ( 6, 2 ))
    for it in range(6):
        big_array[it] = (it,it) # For example
    
    >>>big_array
    
    array([[ 0.,  0.],
           [ 1.,  1.],
           [ 2.,  2.],
           [ 3.,  3.],
           [ 4.,  4.],
           [ 5.,  5.]])
    
  • 0

    每当您遇到以下情况时:

    a = []
    for i in range(5):
        a.append(i)
    

    你想要一些类似于numpy的东西,之前的几个答案都指出了这样做的方法,但正如@katrielalex所指出的那样,这些方法并不高效 . 高效的方式要做到这一点,就是 Build 一个很长的列表,然后在你有一个长列表之后以你想要的方式重塑它 . 例如,假设我正在从文件中读取一些行,并且每行都有一个数字列表,我想构建一个numpy形状的数组(读取的行数,每行中的向量长度) . 以下是我如何更有效地做到这一点:

    long_list = []
    counter = 0
    with open('filename', 'r') as f:
        for row in f:
            row_list = row.split()
            long_list.extend(row_list)
            counter++
    #  now we have a long list and we are ready to reshape
    result = np.array(long_list).reshape(counter, len(row_list)) #  desired numpy array
    
  • 112

    也许这样的东西会满足你的需求..

    import numpy as np
    
    N = 5
    res = []
    
    for i in range(N):
        res.append(np.cumsum(np.ones(shape=(2,4))))
    
    res = np.array(res).reshape((10, 4))
    print(res)
    

    这产生以下输出

    [[ 1.  2.  3.  4.]
     [ 5.  6.  7.  8.]
     [ 1.  2.  3.  4.]
     [ 5.  6.  7.  8.]
     [ 1.  2.  3.  4.]
     [ 5.  6.  7.  8.]
     [ 1.  2.  3.  4.]
     [ 5.  6.  7.  8.]
     [ 1.  2.  3.  4.]
     [ 5.  6.  7.  8.]]
    

相关问题