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

时间:2015-03-10 16:53:31

标签: arrays numpy matrix

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

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

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

[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [ 0  0  0]
 [ 0  0  0]]

提前谢谢

1 个答案:

答案 0 :(得分:5)

您可以使用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.]])

或分配给A.flat

A.flat[:len(B)] = B

或(如al_m指出)如果A是C-contiguous ,您可以使用A.ravel

assert A.flags['C_CONTIGUOUS']
A.ravel()[:len(B)] = B

如果A不是C连续的,那么A.ravel()会返回一个副本。修改副本不会修改A。非C连续数组的示例包括具有非单位步长的切片,例如A[::2]和F连续的数组,例如np.asarray(A, order='F')


您可以使用Python's timeit module对代码进行基准测试。如果你有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

表明A.ravel()[:len(B)] = BA.flat[:len(B)] = B快,np.put(A, np.arange(len(B)), B)比{{1}}快。

根据许多因素,基准可能因机器而异 硬件,操作系统,软件版本或软件的编译方式。一块 代码可能比小数组的替代代码快,但是 较大的数组较慢。因此,当您真的想要进行基准测试时,请务必进行测试 最接近您的实际用例的输入,硬件和软件上的代码 请记住预优化的无用性。