你可以使用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
或者(正如 ali_m 指出的那样)如果 A 是 C 连续的,您可以使用 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,一个特别方便的基准代码sn-ps的方法是使用它的%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 快,A.flat[:len(B)] = B 比np.put(A, np.arange(len(B)), B) 快。
基准可能因机器而异,具体取决于许多因素,例如
硬件、操作系统、软件版本或软件的编译方式。一块
的代码可能比小数组的替代代码更快,但是
对于较大的阵列,速度较慢。所以当你真的想进行基准测试时,一定要测试
输入、硬件和软件上的代码最接近您的实际用例,而
记住预优化是徒劳的。