【问题标题】:A faster way of copying values from a numpy array to another knowing that both arrays have different shapes一种将值从 numpy 数组复制到另一个数组的更快方法,知道两个数组具有不同的形状
【发布时间】:2015-05-12 05:40:30
【问题描述】:

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

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

提前谢谢你

【问题讨论】:

  • @OzanDeniz 谢谢你的链接,但在我的例子中,我使用了两个不同形状的数组,所以这三种解决方案中没有一种可以解决我的问题

标签: arrays numpy matrix


【解决方案1】:

你可以使用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)] = BA.flat[:len(B)] = B 快,A.flat[:len(B)] = Bnp.put(A, np.arange(len(B)), B) 快。

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

【讨论】:

  • 非常感谢,这应该是解决方案,但您知道哪个更快吗?
  • A.ravel()[:len(B)] = B 在我的机器上比 A.flat[:len(B)] = B 快 7 倍
  • @ali_m:ravel 的问题是在某些情况下它返回的是副本而不是视图。当它返回一个副本时,对副本的修改不会影响A。例如,让C = np.zeros((500, 300)) 然后定义A = C[::2]。那么A.ravel()[:len(B)] = B不会修改A
  • 公平点,尽管由于 OP 要求使用快速方法,但我仍然认为 ravel 对于A 是 C 连续数组的常见情况值得一提
  • @ali_m:好点。我已经编辑了帖子以包含ravel。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 2013-03-18
  • 1970-01-01
相关资源
最近更新 更多