gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:29:17 24 4
gpt4 key购买 nike

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

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]]

提前致谢

最佳答案

你可以使用 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 ,对代码片段进行基准测试的一种特别方便的方法是使用它的 %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) 更快。

基准可能因机器而异,具体取决于许多因素,例如硬件、操作系统、软件版本或软件的编译方式。一 block 代码可能比小数组的替代代码更快,但是较大的阵列较慢。所以当你真的想做benchmark的时候,一定要测试最接近实际用例的输入、硬件和软件代码,同时请牢记预优化是徒劳的。

关于arrays - 知道两个数组具有不同形状的将值从 numpy 数组复制到另一个的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28969573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com