有效地复制numpy数组

时间:2015-05-27 14:24:01

标签: python arrays numpy

假设我有一个Nx3数组A和另一个空的MxNx3数组B.我想将值从A复制到B,这样这些值集在B中出现M次。除了使用循环外,如何有效地执行此操作?

3 个答案:

答案 0 :(得分:5)

你可以写b[:] = a并让广播接管。例如:

>>> a = np.arange(6).reshape(2, 3)
>>> b = np.zeros((3, 2, 3))
>>> a
array([[0, 1, 2],
       [3, 4, 5]])
>>> b
array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],
       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],
       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])

然后将a复制到b

>>> b[:] = a
>>> b
array([[[ 0.,  1.,  2.],
        [ 3.,  4.,  5.]],
       [[ 0.,  1.,  2.],
        [ 3.,  4.,  5.]],
       [[ 0.,  1.,  2.],
        [ 3.,  4.,  5.]]])

请注意,b必须能够保存a的数据类型。如果a是一个复数的数组,那么当复制到b时,虚部将会丢失(因为它只能保存浮点值)。

答案 1 :(得分:2)

你也可以写:假设你的数组a numpy array

    ans = numpy.array([a.tolist()*M])

答案 2 :(得分:1)

似乎对于大型数组numpy.repeat(a, repeats, axis)是最快的选择,尽管动态分配b的内存。

import numpy as np
a = np.arange(20 * 30 * 40).reshape(20, 30, 40)
b = np.empty((16, 20, 30, 40))

%timeit b[:] = a
# 272 µs ± 22.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit np.empty((16, 20, 30, 40))[:] = a
# 277 µs ± 19 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit np.repeat(a[np.newaxis, ...], repeats=16, axis=0)
# 140 µs ± 483 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)