我的数据通常采用以下形式
- 由任意形状的N个n维数组的堆栈组成的单个numpy数组(* 例如 *
data.shape = (N, a, b, c, ...)
,其中a, b, c, ...
提前未知),以及 - 一个对应的一维系数数组(e.g.
coefs.shape = (N,)
),我需要沿着沿着第一个轴广播。
例如:
import numpy as np
N = 10
sub_array_shape = 3, 3
# Random data representing arbitrary data from external source
raw_data = np.stack([np.random.randn(*sub_array_shape) for i in range(N)])
corrections = np.random.randn(N)
现在我需要将两个数组一起广播,以便对数据进行校正。我发现有两种方法有效:
1.在操作之前和之后调换数据,如
corrected_data = (raw_data.T + corrections).T
1.用单例维数填充系数数组,如
corrected_data = raw_data + corrections.reshape(-1, *(1,) * (raw_data.ndim - 1))
在我看来,这两种方法都不是非常优雅或可读,所以我想知道是否有更好的方法。在使用numpy数组时,有没有一个标准的方法来解决这个问题?如果不是,我所展示的两种方法中的任何一种都是首选的吗?
我主要关心的是代码的可读性,但我也想知道不同方法之间是否有性能差异。
1条答案
按热度按时间6rqinv9w1#
为了避免歧义,广播规则可以根据需要添加前导维度,但是尾随维度必须是显式的。我不认为有任何“优雅”的方式来添加可变数量的尾随维度,尽管你总是使用函数 Package 器来使任何方法“优雅”。
有两个数组:
对我来说,作为广播调整的语法是:
但它并不适合于可变的维度。
reshape
更容易编程实现,如你的(2)所示:我本来打算建议
broadcast_to
,但这需要那些尾部尺寸:如果它有必要的尾部尺寸,那么它可以使用0步幅执行第二个广播步骤:
expand_dims
也可以使用,但内部我相信它使用reshape
。该守则可能具有指导意义:broadcast_to
可以与“反向”形状一起使用,以添加前导尺寸,然后转置回来。但这只是你的第一个想法: