使用广播从三维数组中减去一维数组(标量列表)

2024-03-28 20:19:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个一维的标量值数组

Y = np.array([1, 2])

我还有一个三维数组:

X = np.random.randint(0, 255, size=(2, 2, 3))

我试图从X中减去Y的每个值,所以我应该返回Z,它的形状应该是(2,2,2,3)或者(2,2,2,3)。你知道吗

我似乎不知道如何通过广播来做到这一点。你知道吗

我试着改变Y的变化:

Y = np.array([[[1, 2]]])

但不确定正确的形状应该是什么。你知道吗


Tags: sizenprandom数组array形状标量randint
2条回答

广播在右边排列。所以您希望对(2, 1, 1, 1)数组和(2, 2, 3)数组进行操作。你知道吗

我能想到的最简单的方法是使用^{}

Y = Y.reshape(-1, 1, 1, 1)

更一般地说:

Y = Y.reshape(-1, *([1] * X.ndim))

至多reshape的一个参数可以是-1,表示其他维度未考虑的所有剩余大小。你知道吗

要获得形状Z(2, 2, 2, 3)Z

Z = X - Y.reshape(-1, *([1] * X.ndim))

如果您对Z的形状(2, 2, 3, 2)满意,那么操作会简单得多:

Z = X[..., None] - Y

Nonenp.newaxis将在X形状的末端插入一个单位轴,使其与1D Y正确广播。你知道吗

我不完全确定要在哪个维度上进行减法,但是如果定义Y,例如Y = numpy.array([1,2]).reshape(2, 1, 1)Y = numpy.array([1,2]).reshape(1, 2, 1),则X - Y不会返回错误。你知道吗

相关问题 更多 >