NumPy:从可迭代创建多维数组

Ram*_*hum 5 python arrays numpy

我有一个可迭代的元组,我想ndarray从中构建一个。说形状会是(12345, 67890)。什么是有效且优雅的方式来做到这一点?

以下是一些选项,以及我排除它们的原因:

  1. np.array(my_tuples)在知道数组大小之前就开始分配数组,根据 NumPy 的文档,这需要低效的重定位。

  2. 使用以下命令创建一个包含未初始化内容的数组np.ndarray((12345, 67890)),然后执行一个循环,用数据填充该数组。它有效并且高效,但有点不优雅,因为它需要多个语句。

  3. 使用np.fromiter它似乎仅适用于一维数组。

有人有更好的解决方案吗?

(我看过这个问题,但我没有看到任何有希望的答案。)

hpa*_*ulj 1

定义一个生成器:

\n\n
def foo(m,n):\n    for i in range(m):\n        yield list(range(i,i+n))\n
Run Code Online (Sandbox Code Playgroud)\n\n

计时几种替代方案:

\n\n
In [93]: timeit np.array(list(foo(3000,4000)))                                  \n1.74 s \xc2\xb1 17.5 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\nIn [94]: timeit list(foo(3000,4000))                                            \n663 ms \xc2\xb1 3.84 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\nIn [95]: timeit np.stack([np.array(row) for row in foo(3000,4000)])             \n1.32 s \xc2\xb1 2.04 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\nIn [96]: timeit np.concatenate([np.array(row, ndmin=2) for row in foo(3000,4000)\n    ...: ])                                                                     \n1.33 s \xc2\xb1 23.1 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\nIn [97]: %%timeit  \n    ...: arr = np.empty((3000,4000),int) \n    ...: for i,row in enumerate(foo(3000,4000)): \n    ...:     arr[i] = row \n    ...:                                                                        \n1.29 s \xc2\xb1 3.1 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n
Run Code Online (Sandbox Code Playgroud)\n\n

并使用扁平发电机:

\n\n
def foo1(m,n):\n    for i in range(m):\n        for j in range(n):\n            yield i+j\nIn [104]: timeit np.fromiter(foo1(3000,4000),int).reshape(3000,4000)            \n1.54 s \xc2\xb1 5.64 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n
Run Code Online (Sandbox Code Playgroud)\n

  • “我们的任务不是去推理为什么,我们的任务是行动并死去。” [阿尔弗雷德·丁尼生勋爵] (4认同)