我有一个数组 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
对。
我的问题是,是否可以使用步幅创建我需要的形状数组,而无需实际复制数据?
最佳答案
My question is if this is possible to use strides to create the array of the shape i need using strides and without actual copying data?
事实并非如此。作为查看此问题的简单方法,请考虑如果您的数组中没有零,则该数组的任何可能 View 都不会为您提供所需的非对角零。
关于python - 用步幅组成 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36802062/