从数组复制到矩阵的更快方法是什么? 例如:
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]]
提前谢谢
答案 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)] = B
比A.flat[:len(B)] = B
快,np.put(A, np.arange(len(B)), B)
比{{1}}快。
根据许多因素,基准可能因机器而异 硬件,操作系统,软件版本或软件的编译方式。一块 代码可能比小数组的替代代码快,但是 较大的数组较慢。因此,当您真的想要进行基准测试时,请务必进行测试 最接近您的实际用例的输入,硬件和软件上的代码 请记住预优化的无用性。