Pythonic方法从numpy数组列表创建一个numpy数组

我在一个循环中生成一维numpy数组列表,然后将该列表转换为2d numpy数组。如果我提前知道了几个项目,那么我将预先分配一个2d的数组,但是我没有将所有内容都列入列表。

模拟如下:

>>> list_of_arrays = map(lambda x: x*ones(2), range(5))
>>> list_of_arrays
[array([ 0.,  0.]), array([ 1.,  1.]), array([ 2.,  2.]), array([ 3.,  3.]), array([ 4.,  4.])]
>>> arr = array(list_of_arrays)
>>> arr
array([[ 0.,  0.],
       [ 1.,  1.],
       [ 2.,  2.],
       [ 3.,  3.],
       [ 4.,  4.]])

我的问题如下:

有没有更好的方法(性能方面)来收集顺序数字数据(在我的情况下是numpy数组)的任务,而不是将它们放在一个列表中,然后从中创建一个numpy.array(我正在创建一个新的obj和复制数据)?在经过良好测试的模块中是否有可扩展的矩阵数据结构?

我的2d矩阵的典型尺寸将在100×10和5000×10之间

编辑:在这个例子中,我使用地图,但在我的实际应用中,我有一个for循环

假设你知道最终的数组arr永远不会大于5000×10。
然后,您可以预先分配最大大小的数组,并将数据填充为
你通过循环,然后使用arr.resize将其剪切到
退出循环后发现大小。

下面的测试表明这样做会稍微快于构建中间体
python列表,无论数组的最终大小是多少。

此外,arr.resize会分配未使用的内存,因此最终(尽管可能不是中间)内存占用小于python_lists_to_array所使用的内存。

这显示numpy_all_the_way更快:

% python -mtimeit -s"import test" "test.numpy_all_the_way(100)"
100 loops, best of 3: 1.78 msec per loop
% python -mtimeit -s"import test" "test.numpy_all_the_way(1000)"
100 loops, best of 3: 18.1 msec per loop
% python -mtimeit -s"import test" "test.numpy_all_the_way(5000)"
10 loops, best of 3: 90.4 msec per loop

% python -mtimeit -s"import test" "test.python_lists_to_array(100)"
1000 loops, best of 3: 1.97 msec per loop
% python -mtimeit -s"import test" "test.python_lists_to_array(1000)"
10 loops, best of 3: 20.3 msec per loop
% python -mtimeit -s"import test" "test.python_lists_to_array(5000)"
10 loops, best of 3: 101 msec per loop

这显示numpy_all_the_way使用较少的内存:

% test.py
Initial memory usage: 19788
After python_lists_to_array: 20976
After numpy_all_the_way: 20348

test.py:

#!/usr/bin/env python
import numpy as np
import os

def memory_usage():
    pid=os.getpid()
    return next(line for line in open('/proc/%s/status'%pid).read().splitlines()
            if line.startswith('VmSize')).split()[-2]

N,M=5000,10

def python_lists_to_array(k):
    list_of_arrays = map(lambda x: x*np.ones(M), range(k))
    arr = np.array(list_of_arrays)
    return arr

def numpy_all_the_way(k):
    arr=np.empty((N,M))
    for x in range(k):
        arr[x]=x*np.ones(M)
    arr.resize((k,M))
    return arr

if __name__=='__main__':
    print('Initial memory usage: %s'%memory_usage())
    arr=python_lists_to_array(5000)
    print('After python_lists_to_array: %s'%memory_usage())    
    arr=numpy_all_the_way(5000)
    print('After numpy_all_the_way: %s'%memory_usage())    
翻译自:https://stackoverflow.com/questions/2106287/pythonic-way-to-create-a-numpy-array-from-a-list-of-numpy-arrays

转载注明原文:Pythonic方法从numpy数组列表创建一个numpy数组