【发布时间】:2016-04-22 19:41:05
【问题描述】:
我有一个数组A1_ijk 并想将它广播到A2_ijmnk,但仅适用于m=n 的情况。否则A2 应该用零填充。当然,我可以创建新的空数组并用A1 填充它,如下所示:
import numpy as np
A1 = np.random.rand(100, 5, 3)
A2 = np.zeros((100, 5, 2, 2, 3))
A2[..., 0, 0, :] = A1
A2[..., 1, 1, :] = A1
但是,我觉得这可以以更有效的方式完成。我试过as_strided:
as_strided = np.lib.stride_tricks.as_strided
sz = A1.itemsize
A2 = as_strided(A1, shape=(100,5,2,2,3), strides=(5*3*sz, 3*sz, 0, 0, sz))
还有broadcast_to:
broadcast_to = np.lib.stride_tricks.broadcast_to
A2=broadcast_to(A1[...,None,None,:], (100,5,2,2,3))
不幸的是,这两种方法都用A1 值填充所有m, n 对。
我的问题是,是否可以使用跨步创建我需要的形状的数组,而无需实际复制数据?
【问题讨论】:
-
在您的实际情况中
A2.shape[2],A2.shape[3]也将是(2,2)吗?如果是这样,对于这么小的尺寸,您的代码在可读性和性能方面对我来说看起来还不错。 -
这可以是
(2,2)、(3,3),但也可以是更多维度,例如m,n,o,p、(2,2,2,2)或(3,3,3,3)。但是我必须经常撰写A2。我希望大步前进,我只能更新A1并立即看到A2的变化。 -
不是连续构造
A1并试图使A2成为A1的视图,你可以让A1成为A2的视图吗? -
理论上是的,但在这种情况下更新
A1只会更新A2的查看部分,不是吗? -
是的。如果您要使
A1成为A2的视图,则必须更改代码进行修改的方式。更新A1还不够。