有没有办法初始化一个形状的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 回答
要么
要么
但是,我们通过将元素附加到列表来构造数组的心态在numpy中使用不多,因为它效率较低(numpy数据类型更接近底层C数组) . 相反,您应该将数组预先分配到您需要的大小,然后填写行 . 但是,如果必须的话,可以使用
numpy.append
.我通常这样做的方法是创建一个常规列表,然后将我的东西添加到其中,最后将列表转换为numpy数组,如下所示:
当然,你的最终对象在创建步骤中占用内存空间的两倍,但是在python列表上追加非常快,并且使用np.array()创建也是如此 .
python的数组模拟
是:
在numpy 1.8中引入:
例子:
numpy.fromiter()
正在寻找你:它也适用于生成器表达式,例如:
如果您事先知道数组的长度,则可以使用可选的'count'参数指定它 .
在进行数组计算时,您确实希望尽可能避免显式循环,因为这会降低该计算形式的速度增益 . 有多种方法可以初始化numpy数组 . 如果你想要它填充零,请像katrielalex说:
big_array = numpy.zeros((10,4))
编辑:你正在制作什么样的序列?您应该检查创建数组的不同numpy函数,如
numpy.linspace(start, stop, size)
(等间距数字)或numpy.arange(start, stop, inc)
. 在可能的情况下,这些函数将使数组比在显式循环中执行相同的工作快得多对于您的第一个数组示例使用,
要初始化big_array,请使用
这假设你想用零初始化,这很典型,但还有很多其他的ways to initialize an array in numpy .
Edit: 如果您通常最好先使用追加来构建Python列表,并且当您在列表中收集了所有内容时,请使用
numpy.array(mylist)
将此列表转换为numpy数组 . 这样做的原因是列表意味着非常有效和快速地增长,而numpy.concatenate效率非常低,因为numpy数组不容易改变大小 . 但是一旦在列表中收集了所有内容,并且您知道最终的数组大小,就可以有效地构造一个numpy数组 .我意识到这有点晚了,但我没有注意到任何其他答案提到索引到空数组:
这样,您可以使用
numpy.empty
预分配整个结果数组,并使用索引赋值填充行 .在您给出的示例中预先分配
empty
而不是zeros
是完全安全的,因为您保证整个数组将填充您生成的块 .输出:
我建议先定义形状 . 然后迭代它以插入值 .
每当您遇到以下情况时:
你想要一些类似于numpy的东西,之前的几个答案都指出了这样做的方法,但正如@katrielalex所指出的那样,这些方法并不高效 . 高效的方式要做到这一点,就是 Build 一个很长的列表,然后在你有一个长列表之后以你想要的方式重塑它 . 例如,假设我正在从文件中读取一些行,并且每行都有一个数字列表,我想构建一个numpy形状的数组(读取的行数,每行中的向量长度) . 以下是我如何更有效地做到这一点:
也许这样的东西会满足你的需求..
这产生以下输出