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