python 数组拷贝,如何将数据从一个numpy数组复制到另一个数组

为了回答你的问题,我玩了一些变体,并对它们进行了分析。

结论:将数据从一个numpy数组复制到另一个使用内置的numpy函数numpy.array(src)或numpy.copyto(dst, src) 。

(但是如果dst的内存已经被分配了,总是select后面的内存来重用内存。

分析设置

import timeit import numpy as np import pandas as pd from IPython.display import display def profile_this(methods, setup='', niter=10**4, p_globals=None, **kwargs): if p_globals is not None: print('globals: {0}, tested {1:.0e} times'.format(p_globals, niter)) timings = np.array([timeit.timeit(method, setup=setup, number=niter, globals=p_globals, **kwargs) for method in methods]) ranking = np.argsort(timings) timings = np.array(timings)[ranking] methods = np.array(methods)[ranking] speedups = np.max(timings) / timings pd.set_option('html', False) data = {'time (s)': timings, 'speedup': ['{0:0.2f}x'.format(s) if 1 != s else '' for s in speedups], 'methods': methods} data_frame = pd.DataFrame(data, columns=['time (s)', 'speedup', 'methods']) display(data_frame) print()

分析代码

setup = '''import numpy as np; x = np.random.random(n)''' methods = ( '''y = np.zeros(n, dtype=x.dtype); y[:] = x''', '''y = np.zeros_like(x); y[:] = x''', '''y = np.empty(n, dtype=x.dtype); y[:] = x''', '''y = np.empty_like(x); y[:] = x''', '''y = np.copy(x)''', '''y = x.astype(x.dtype)''', '''y = 1*x''', '''y = np.empty_like(x); np.copyto(y, x)''', '''y = np.empty_like(x); np.copyto(y, x, casting='no')''', '''y = np.empty(n)\nfor i in range(x.size):\n\ty[i] = x[i]''' ) for n, it in ((2, 6), (3, 6), (3.8, 6), (4, 6), (5, 5), (6, 4.5)): profile_this(methods[:-1:] if n > 2 else methods, setup, int(10**it), {'n': int(10**n)})

Windows 7在Intel i7 CPU,CPython v3.5.0,numpy v1.10.1上的结果。

globals: {'n': 100}, tested 1e+06 times time (s) speedup methods 0 0.386908 33.76xy = np.array(x) 1 0.496475 26.31xy = x.astype(x.dtype) 2 0.567027 23.03xy = np.empty_like(x); np.copyto(y, x) 3 0.666129 19.61xy = np.empty_like(x); y[:] = x 4 0.967086 13.51xy = 1*x 5 1.067240 12.24xy = np.empty_like(x); np.copyto(y, x, casting=... 6 1.235198 10.57xy = np.copy(x) 7 1.624535 8.04xy = np.zeros(n, dtype=x.dtype); y[:] = x 8 1.626120 8.03xy = np.empty(n, dtype=x.dtype); y[:] = x 9 3.569372 3.66xy = np.zeros_like(x); y[:] = x 10 13.061154 y = np.empty(n)\nfor i in range(x.size):\n\ty[... globals: {'n': 1000}, tested 1e+06 times time (s) speedup methods 0 0.666237 6.10xy = x.astype(x.dtype) 1 0.740594 5.49xy = np.empty_like(x); np.copyto(y, x) 2 0.755246 5.39xy = np.array(x) 3 1.043631 3.90xy = np.empty_like(x); y[:] = x 4 1.398793 2.91xy = 1*x 5 1.434299 2.84xy = np.empty_like(x); np.copyto(y, x, casting=... 6 1.544769 2.63xy = np.copy(x) 7 1.873119 2.17xy = np.empty(n, dtype=x.dtype); y[:] = x 8 2.355593 1.73xy = np.zeros(n, dtype=x.dtype); y[:] = x 9 4.067133 y = np.zeros_like(x); y[:] = x globals: {'n': 6309}, tested 1e+06 times time (s) speedup methods 0 2.338428 3.05xy = np.array(x) 1 2.466636 2.89xy = x.astype(x.dtype) 2 2.561535 2.78xy = np.empty_like(x); np.copyto(y, x) 3 2.603601 2.74xy = np.empty_like(x); y[:] = x 4 3.005610 2.37xy = np.empty_like(x); np.copyto(y, x, casting=... 5 3.215863 2.22xy = np.copy(x) 6 3.249763 2.19xy = 1*x 7 3.661599 1.95xy = np.empty(n, dtype=x.dtype); y[:] = x 8 6.344077 1.12xy = np.zeros(n, dtype=x.dtype); y[:] = x 9 7.133050 y = np.zeros_like(x); y[:] = x globals: {'n': 10000}, tested 1e+06 times time (s) speedup methods 0 3.421806 2.82xy = np.array(x) 1 3.569501 2.71xy = x.astype(x.dtype) 2 3.618747 2.67xy = np.empty_like(x); np.copyto(y, x) 3 3.708604 2.61xy = np.empty_like(x); y[:] = x 4 4.150505 2.33xy = np.empty_like(x); np.copyto(y, x, casting=... 5 4.402126 2.19xy = np.copy(x) 6 4.917966 1.96xy = np.empty(n, dtype=x.dtype); y[:] = x 7 4.941269 1.96xy = 1*x 8 8.925884 1.08xy = np.zeros(n, dtype=x.dtype); y[:] = x 9 9.661437 y = np.zeros_like(x); y[:] = x globals: {'n': 100000}, tested 1e+05 times time (s) speedup methods 0 3.858588 2.63xy = x.astype(x.dtype) 1 3.873989 2.62xy = np.array(x) 2 3.896584 2.60xy = np.empty_like(x); np.copyto(y, x) 3 3.919729 2.58xy = np.empty_like(x); np.copyto(y, x, casting=... 4 3.948563 2.57xy = np.empty_like(x); y[:] = x 5 4.000521 2.53xy = np.copy(x) 6 4.087255 2.48xy = np.empty(n, dtype=x.dtype); y[:] = x 7 4.803606 2.11xy = 1*x 8 6.723291 1.51xy = np.zeros_like(x); y[:] = x 9 10.131983 y = np.zeros(n, dtype=x.dtype); y[:] = x globals: {'n': 1000000}, tested 3e+04 times time (s) speedup methods 0 85.625484 1.24xy = np.empty_like(x); y[:] = x 1 85.693316 1.24xy = np.empty_like(x); np.copyto(y, x) 2 85.790064 1.24xy = np.empty_like(x); np.copyto(y, x, casting=... 3 86.342230 1.23xy = np.empty(n, dtype=x.dtype); y[:] = x 4 86.954862 1.22xy = np.zeros(n, dtype=x.dtype); y[:] = x 5 89.503368 1.18xy = np.array(x) 6 91.986177 1.15xy = 1*x 7 95.216021 1.11xy = np.copy(x) 8 100.524358 1.05xy = x.astype(x.dtype) 9 106.045746 y = np.zeros_like(x); y[:] = x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值