初始化一个numpy数组

Cur*_*arn 111 python arrays numpy

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

a = []
for i in range(5):
    a.append(i)
Run Code Online (Sandbox Code Playgroud)

我想用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
Run Code Online (Sandbox Code Playgroud)

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


编辑:

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

Kat*_*iel 141

numpy.zeros

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

要么

numpy.ones

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

要么

numpy.empty

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


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

  • @Curious:嗯,numpy中有一个'append`.只是因为没有预分配效率较低(在这种情况下效率低得多,因为`append`ing每次复制整个数组),所以它不是标准技术. (3认同)
  • 我知道我可以设置big_array = numpy.zeros,然后用创建的小数组填充它。但是,这需要我预先指定big_array的大小。有没有像.append那样的list函数,我没有事先指定大小。谢谢! (2认同)
  • @ Curious2learn.不,没有什么比Numpy更好的了.有些函数可以连接数组或通过创建新数组来堆叠它们,但它们不会通过追加来实现.这是因为数据结构的设置方式.Numpy阵列由于能够更紧凑地存储值而变得快速,但是它们需要具有固定的大小以获得该速度.Python列表旨在以速度和大小为代价更灵活. (2认同)

小智 38

我通常这样做的方法是创建一个常规列表,然后将我的东西添加到其中,最后将列表转换为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
Run Code Online (Sandbox Code Playgroud)

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

  • **如果你提前知道数组的大小,这不是你想要的方法**,但是......当我不知道数组最终会有多大时,我最终经常使用这种方法.例如,从文件或其他进程读取数据时.因为python和numpy非常聪明,所以它起初并不像它看起来那么糟糕. (10认同)

Fra*_*urt 13

在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]])
Run Code Online (Sandbox Code Playgroud)


Ado*_*obe 12

python的数组模拟

a = []
for i in range(5):
    a.append(i)
Run Code Online (Sandbox Code Playgroud)

是:

import numpy as np

a = np.empty((0))
for i in range(5):
    a = np.append(a, i)
Run Code Online (Sandbox Code Playgroud)

  • @NicholasTJ:`empty((0))`初始化一个numpy数组. (5认同)
  • np.empty((0))中的括号是多余的. (2认同)

edW*_*edW 8

要使用特定矩阵初始化 numpy 数组:

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
Run Code Online (Sandbox Code Playgroud)

输出:

(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]]
Run Code Online (Sandbox Code Playgroud)


Qua*_*lis 7

numpy.fromiter() 是你在找什么:

big_array = numpy.fromiter(xrange(5), dtype="int")
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 我实际上运行timeit,我认为np.fromiter()可能比np.array()慢.timeit("np.array(i for i in xrange(100))",setup ="import numpy as np",number = 10000) - > 0.02539992332458496,与timeit("np.fromiter((i for x in xrange( 100)),dtype = int)",setup ="import numpy as np",number = 10000) - > 0.13351011276245117 (2认同)

And*_*vik 6

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

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

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


tom*_*m10 5

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

a = numpy.arange(5)
Run Code Online (Sandbox Code Playgroud)

要初始化big_array,请使用

big_array = numpy.zeros((10,4))
Run Code Online (Sandbox Code Playgroud)

这假设你想用零初始化,这是非常典型的,但还有许多其他方法来初始化numpy中的数组.

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