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中使用不多,因为它效率较低(numpy数据类型更接近底层C数组).相反,您应该将数组预先分配到您需要的大小,然后填写行.numpy.append但是,如果必须的话,你可以使用.
小智 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()创建也是如此.
Fra*_*urt 13
在numpy 1.8中引入:
返回给定形状和类型的新数组,填充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)
要使用特定矩阵初始化 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)
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'参数指定它.
在进行数组计算时,您确实希望尽可能避免显式循环,因为这会降低该计算形式的速度增益.有多种方法可以初始化numpy数组.如果你想要它填充零,请像katrielalex说:
big_array = numpy.zeros((10,4))
编辑:你正在制作什么样的序列?你应该检查创建数组的不同numpy函数,如numpy.linspace(start, stop, size)(等间距数),或numpy.arange(start, stop, inc).在可能的情况下,这些函数将使数组比在显式循环中执行相同的工作快得多
对于您的第一个数组示例使用,
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数组.