我有一个数组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
:
还有broadcast_to
:
broadcast_to = np.lib.stride_tricks.broadcast_to
A2=broadcast_to(A1[...,None,None,:], (100,5,2,2,3))
不幸的是,这两种方法都用A1
值填充所有m, n
对。在
我的问题是,是否可以使用跨步创建我需要的形状数组,而不需要实际复制数据?在
我可以用
np.diag_indices
简化编码。我不认为效率是相对于一个快速的解决方案(如果可能的话)。让我们看看我是否可以简化我的开发历史首先是指数
更简单的开始;我们不需要2维开始,那些可以改变重塑。我们可能不需要结束维度,但我暂时不谈这个问题:
^{pr2}$现在构建参考解决方案:
备选方案:
第一次尝试时形状不匹配
我们需要修改
A1
,以便它可以广播到目标插槽。在A2[...,i,j,:] = A1[...,None,:]
应该处理您的示例。在更简单的版本,从一维阵列开始,扩展到三维
a3
没有a1
值的重复模式;或者是这样?在正如您所发现的,用
as_strides
填充所有插槽很容易,但仅填充对角线很难:不是的。作为一种简单的方法,考虑一下如果数组中没有零,则该数组的任何可能视图都不会给出所需的非对角零。在
您需要用至少n阶零填充数据;然后可以设置stride[n]==-stride[m]以达到预期效果,并避免分配n*m个顺序的零。在
但有些事情告诉我,如果你放眼全局,一定会有一个更优雅的解决方案来解决你的问题。在
相关问题 更多 >
编程相关推荐