知道两个数组具有不同形状的更快方法是将值从numpy数组复制到另一个数组

mim*_*mou 2 arrays numpy matrix

什么是从数组复制到矩阵的更快的方法.例:

A = np.zeros((5, 3))
B = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
Run Code Online (Sandbox Code Playgroud)

将B的值复制到A后,生成的A应为:

[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [ 0  0  0]
 [ 0  0  0]]
Run Code Online (Sandbox Code Playgroud)

先感谢您

unu*_*tbu 6

你可以使用np.put:

In [74]: np.put(A, np.arange(len(B)), B)

In [75]: A
Out[75]: 
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.],
       [ 7.,  8.,  9.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])
Run Code Online (Sandbox Code Playgroud)

或分配给A.flat:

A.flat[:len(B)] = B
Run Code Online (Sandbox Code Playgroud)

或者(如al_m指出)如果A是C连续的,你可以使用A.ravel:

assert A.flags['C_CONTIGUOUS']
A.ravel()[:len(B)] = B
Run Code Online (Sandbox Code Playgroud)

如果A不是C-contiguous,则A.ravel()返回副本.修改副本不会修改A.非C连续阵列的示例包括具有非单位步长的切片,例如A[::2]F-连续阵列,例如np.asarray(A, order='F').


您可以使用Python的timeit模块来对代码进行基准测试.如果你有IPython,一个特别方便的基准代码片段的方法是使用它的%timeit"魔术"功能:

In [83]: A = np.zeros((500, 300))

In [84]: B = np.tile(np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]),1000)

In [88]: %timeit A = np.zeros((500, 300)); A.flat[:len(B)] = B
10000 loops, best of 3: 158 µs per loop

In [89]: %timeit A = np.zeros((500, 300)); np.put(A, np.arange(len(B)), B)
1000 loops, best of 3: 238 µs per loop

In [18]: %timeit A = np.zeros((500, 300)); A.ravel()[:len(B)] = B
10000 loops, best of 3: 91.6 µs per loop
Run Code Online (Sandbox Code Playgroud)

这表明A.ravel()[:len(B)] = B速度比A.flat[:len(B)] = B速度快np.put(A, np.arange(len(B)), B).

基准可能因机器而异,具体取决于许多因素,如硬件,操作系统,软件版本或软件编译方式.对于小型阵列,一段代码可能比另一段代码更快,但对于大型阵列则更慢.因此,当您真正想要进行基准测试时,请务必在最接近实际用例的输入,硬件和软件上测试代码,同时牢记预优化的无用性.