Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy 为什么通过向后对齐轴来进行广播_Numpy_Broadcasting - Fatal编程技术网

Numpy 为什么通过向后对齐轴来进行广播

Numpy 为什么通过向后对齐轴来进行广播,numpy,broadcasting,Numpy,Broadcasting,Numpy的广播规则又一次伤害了我,我开始觉得这可能是一种思考的方式 我错过的话题 我经常遇到以下情况:数组的第一个轴是为固定的对象保留的,比如样本数。对于某些数组,第二个轴可以表示每个样本的不同独立变量,或者当数组中每个样本只附加一个数量时,第二个轴可能不存在。例如,如果数组名为price,我可能只使用一个轴,表示每个样本的价格。另一方面,第二个轴有时更自然。例如,我可以使用一个神经网络来计算每个样本的数量,因为神经网络通常可以计算任意多值函数,所以我使用的库通常会返回一个2d数组,如果我使用

Numpy的广播规则又一次伤害了我,我开始觉得这可能是一种思考的方式 我错过的话题

我经常遇到以下情况:数组的第一个轴是为固定的对象保留的,比如样本数。对于某些数组,第二个轴可以表示每个样本的不同独立变量,或者当数组中每个样本只附加一个数量时,第二个轴可能不存在。例如,如果数组名为price,我可能只使用一个轴,表示每个样本的价格。另一方面,第二个轴有时更自然。例如,我可以使用一个神经网络来计算每个样本的数量,因为神经网络通常可以计算任意多值函数,所以我使用的库通常会返回一个2d数组,如果我使用它来计算单个因变量,则第二个轴是单态的。我发现这种使用2d数组的方法也更适合我的代码的未来扩展

长话短说,我需要在我的代码库的各个地方做出决定,是将数组存储为1000,还是1000,1,并且需求的变化有时会导致需要从一种格式切换到另一种格式。 通常,这些数组与最多有4个轴的数组共存,这进一步增加了有时引入单例第二轴的压力,然后让第三个轴代表所有使用它的数组的一致语义质量

现在,当我添加1000或1000,1数组时,问题就出现了,期望得到1000,1,但由于隐式广播而得到10001000

我觉得这阻止了赋予轴语义。当然,我可以始终使用至少两个轴,但这就引出了一个问题:为了确保故障安全,继续这个逻辑,我必须始终使用至少6个轴的数组来表示所有内容

我知道这可能不是技术上定义得最好的问题,但有没有人有一种方法可以帮助他们避免此类错误


有人知道numpy开发人员以相反顺序排列轴以进行广播的动机吗?这背后是计算效率还是其他技术原因,还是我不理解的思维模式?

在MATLAB广播中,jonny最近来到这个游戏,扩展了跟踪维度。但在那里,尾随尺寸是最外层的,即order='F'。由于一切都是从2d开始的,所以只有当一个阵列是3d或更大时才会发生这种扩展

解释,并给出一点历史。我自己的语言历史已经足够悠久了,所以ma_expanded=maones3,1,:扩展的风格很熟悉。倍频程在MATLAB之前增加了广播

为了避免歧义,广播扩展只能在一个方向上进行。向最外层维度的方向扩展似乎是合乎逻辑的

比较3,扩展到1,3与3,1-视为嵌套列表:

In [198]: np.array([1,2,3])                                                                                  
Out[198]: array([1, 2, 3])
In [199]: np.array([[1,2,3]])                                                                                
Out[199]: array([[1, 2, 3]])
In [200]: (np.array([[1,2,3]]).T).tolist()                                                                   
Out[200]: [[1], [2], [3]]
我不知道是否有显著的实施优势。有了跨越机制,在任何地方添加新维度都很容易。只需更改形状和步幅,为需要“复制”的维度添加0

In [203]: np.broadcast_arrays(np.array([1,2,3]),np.array([[1],[2],[3]]),np.ones((3,3)))                      
Out[203]: 
[array([[1, 2, 3],
        [1, 2, 3],
        [1, 2, 3]]), array([[1, 1, 1],
        [2, 2, 2],
        [3, 3, 3]]), array([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])]
In [204]: [x.strides for x in _]                                                                             
Out[204]: [(0, 8), (8, 0), (24, 8)]

在MATLAB广播中,jonny最近来到这个游戏中,扩展了跟踪维度。但在那里,尾随尺寸是最外层的,即order='F'。由于一切都是从2d开始的,所以只有当一个阵列是3d或更大时才会发生这种扩展

解释,并给出一点历史。我自己的语言历史已经足够悠久了,所以ma_expanded=maones3,1,:扩展的风格很熟悉。倍频程在MATLAB之前增加了广播

为了避免歧义,广播扩展只能在一个方向上进行。向最外层维度的方向扩展似乎是合乎逻辑的

比较3,扩展到1,3与3,1-视为嵌套列表:

In [198]: np.array([1,2,3])                                                                                  
Out[198]: array([1, 2, 3])
In [199]: np.array([[1,2,3]])                                                                                
Out[199]: array([[1, 2, 3]])
In [200]: (np.array([[1,2,3]]).T).tolist()                                                                   
Out[200]: [[1], [2], [3]]
我不知道是否有显著的实施优势。有了跨越机制,在任何地方添加新维度都很容易。只需更改形状和步幅,为需要“复制”的维度添加0

In [203]: np.broadcast_arrays(np.array([1,2,3]),np.array([[1],[2],[3]]),np.ones((3,3)))                      
Out[203]: 
[array([[1, 2, 3],
        [1, 2, 3],
        [1, 2, 3]]), array([[1, 1, 1],
        [2, 2, 2],
        [3, 3, 3]]), array([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])]
In [204]: [x.strides for x in _]                                                                             
Out[204]: [(0, 8), (8, 0), (24, 8)]

为什么你需要一个n,1的形状?如果我要增加一个尺寸为1的维度,一个领先的外部维度会感觉更自然。也许我和numpy合作的时间太长了,已经将广播规则内化了。@hpaulj-hm,这听起来很简单,但我很惊讶你会说这是自然的。第一个意思是世界上最左边的,不是吗?我来看看你的方法是否会引起其他我想不到的问题。右对齐的一个重要吸引人的特点是,具有相同尾随维度的相同类型的两个C-连续数组具有相同的尾随步长。通常情况下,左对齐的情况并非如此。同样的问题发生在我的天文学图书馆的天空场中。我想把固定尺寸3放在顶部,这样
s可以使用Python元组对数组进行解包x、y、z=…并将变量维度(如时间样本)沿尾随轴放置。但是后来广播倒过来了,试着把我的数学运算和时间轴而不是坐标轴配对。为什么你需要一个n,1的形状?如果我要增加一个尺寸为1的维度,一个领先的外部维度会感觉更自然。也许我和numpy合作的时间太长了,已经将广播规则内化了。@hpaulj-hm,这听起来很简单,但我很惊讶你会说这是自然的。第一个意思是世界上最左边的,不是吗?我来看看你的方法是否会引起其他我想不到的问题。右对齐的一个重要吸引人的特点是,具有相同尾随维度的相同类型的两个C-连续数组具有相同的尾随步长。通常情况下,左对齐的情况并非如此。同样的问题发生在我的天文学图书馆的天空场中。我想把固定维度3放在顶部,这样人们就可以使用Python元组对数组进行解包x,y,z=…并沿后轴放置变量维度,如时间样本。但后来广播倒过来了,试图把我的数学运算与时间轴而不是坐标轴配对。