Ram*_*hum 5 python arrays numpy
我有一个可迭代的元组,我想ndarray从中构建一个。说形状会是(12345, 67890)。什么是有效且优雅的方式来做到这一点?
以下是一些选项,以及我排除它们的原因:
np.array(my_tuples)在知道数组大小之前就开始分配数组,根据 NumPy 的文档,这需要低效的重定位。
使用以下命令创建一个包含未初始化内容的数组np.ndarray((12345, 67890)),然后执行一个循环,用数据填充该数组。它有效并且高效,但有点不优雅,因为它需要多个语句。
使用np.fromiter它似乎仅适用于一维数组。
有人有更好的解决方案吗?
(我看过这个问题,但我没有看到任何有希望的答案。)
定义一个生成器:
\n\ndef foo(m,n):\n for i in range(m):\n yield list(range(i,i+n))\nRun Code Online (Sandbox Code Playgroud)\n\n计时几种替代方案:
\n\nIn [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)\nRun Code Online (Sandbox Code Playgroud)\n\n并使用扁平发电机:
\n\ndef 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)\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1215 次 |
| 最近记录: |