作者:手机用户2502940417_253 | 来源:互联网 | 2023-05-18 16:33
什么是从数组复制到矩阵的更快的方法.例:
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> unutbu..:
你可以使用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连续的,你可以使用A.ravel
:
assert A.flags['C_CONTIGUOUS']
A.ravel()[:len(B)] = B
如果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
这表明A.ravel()[:len(B)] = B
速度比A.flat[:len(B)] = B
速度快np.put(A, np.arange(len(B)), B)
.
基准可能因机器而异,具体取决于许多因素,如硬件,操作系统,软件版本或软件编译方式.对于小型阵列,一段代码可能比另一段代码更快,但对于大型阵列则更慢.因此,当您真正想要进行基准测试时,请务必在最接近实际用例的输入,硬件和软件上测试代码,同时牢记预优化的无用性.