python - 用 x 计算 x**k,k 是任意维度的数组

标签 python arrays numpy

我有两个 numpy 数组:一个数组 x 形状为 (n, a0, a1, ...) 和一个数组 k形状为 (n, b0, b1, ...)。我想计算指数数组,使输出具有维度 (a0, a1, ..., b0, b1, ...)

out[i0, i1, ..., j0, j1, ...] == prod(x[:, i0, i1, ...] ** k[:, j0, j1, ...])

如果只有一个a_i和一个b_j,广播通过

import numpy

x = numpy.random.rand(2, 31)
k = numpy.random.randint(1, 10, size=(2, 101))

out = numpy.prod(x[..., None]**k[:, None], axis=0)

如果 x 多了几个维度,则必须添加更多的 None:

x = numpy.random.rand(2, 31, 32, 33)
k = numpy.random.randint(1, 10, size=(2, 101))

out = numpy.prod(x[..., None]**k[:, None, None, None], axis=0)

如果x多了几个维度,就需要在其他地方添加更多的None:

x = numpy.random.rand(2, 31)
k = numpy.random.randint(1, 10, size=(2, 51, 51))

out = numpy.prod(x[..., None, None]**k[:, None], axis=0)

如何使 out 的计算与输入数组的维数相关?

最佳答案

下面是使用两个数组的 reshape ,以便它们可以相互广播,然后执行这些操作并沿第一个轴减少prod -

k0_shp = [k.shape[0]] + [1]*(x.ndim-1) + list(k.shape[1:])
x0_shp = list(x.shape) + [1]*(k.ndim-1)
out = (x.reshape(x0_shp) ** k.reshape(k0_shp)).prod(0)

这是将两个输入 reshape 为 3D 的另一种方法,允许每个输入一个单例暗淡,这样它们就可以相互广播,执行 prod 缩减以获得 二维 数组,然后 reshape 回多维度数组 -

s = x.shape[1:] + k.shape[1:] # output shape
out = (x.reshape(x.shape[0],-1,1)**k.reshape(k.shape[0],1,-1)).prod(0).reshape(s)

必须注意, reshape 只是创建输入数组的 View ,因此在内存方面和性能方面实际上都是免费的。

关于python - 用 x 计算 x**k,k 是任意维度的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46689373/

相关文章:

java - 有人可以帮我在单击 JAVA Jbutton 时添加文本吗?

python - isinstance() 和 np.issubdtype() 有什么区别?

python - 将矩阵的行分配给新矩阵

python - 标准化嵌套列表中的数字

C:如果直到运行时才知道大小,我如何初始化全局数组?

javascript - [] == ![] 计算结果为真

python - 组合数组以产生新的集体数组

python - 将文本文件导入为 numpy 中的矩阵

python - 时间序列 Pandas 的线性回归

python - 无法在 python 中导入/安装任何库