负整数作为np.r_?的第三个参数(numpy)

时间:2019-07-30 08:54:43

标签: numpy

https://docs.scipy.org/doc/numpy/reference/generated/numpy.r_.html

负整数指定应在新形状元组中放置升级数组最后一维的位置,因此默认值为-1。

这句话是什么意思?

np.r_['0,2,-5', [1,2,3],[4,5,6] ] # ValueError: all the input array dimensions except for the concatenation axis must match exactly
np.r_['0,2,-6', [1,2,3],[4,5,6] ] # array([[1],[2],[3],[4],[5],[6]])

-5和-6都超过了'0,2,-5'中的第二个参数“ 2”,为什么-5不能运行,但是-6可以运行?

1 个答案:

答案 0 :(得分:1)

对此第三个值的描述有些混乱,但是使用这些列表和其他数字,有两种可能性(加上错误情况):

In [31]: np.r_['0,2', [1,2,3],[4,5,6] ]         # or '0,2,-1'                                                             
Out[31]: 
array([[1, 2, 3],
       [4, 5, 6]])
In [32]: np.r_['0,2,0', [1,2,3],[4,5,6] ]                                                                    
Out[32]: 
array([[1],
       [2],
       [3],
       [4],
       [5],
       [6]])

[1,2,3]作为数组具有形状(3,)。 “ 2”表示将其扩展为2d,即(1,3)或(3,1)。第三位数字控制哪个。工作原理的细节有些复杂。

您可以在np.lib.index_tricks.AxisConcatenator上亲自查看代码。

在我的测试中,“ 0,2,1”就像默认值一样,“ 0,2,-3”也是如此。其他正值会产生错误,其他负值会表现为0。在我的测试中,“-5”与“ -6”相同。

In [46]: np.r_['0,2,-5', [1,2,3],[4,5,6] ].shape                                                             
Out[46]: (6, 1)
In [47]: np.r_['0,2,-6', [1,2,3],[4,5,6] ].shape                                                             
Out[47]: (6, 1)

对于3d扩展,有3种可能性:

In [48]: np.r_['0,3,-1', [1,2,3],[4,5,6] ].shape   # (1,1,3)                                                            
Out[48]: (2, 1, 3)
In [49]: np.r_['0,3,0', [1,2,3],[4,5,6] ].shape    # (3,1,1)                                                          
Out[49]: (6, 1, 1)
In [50]: np.r_['0,3,1', [1,2,3],[4,5,6] ].shape    # (1,3,1)                                                          
Out[50]: (2, 3, 1)

在(2,3)形状数组扩展到3d的情况下,替代项是(2,3,1)或(1,2,3)。无法在中间插入新尺寸。

In [60]: np.r_['0,3,0', np.ones((2,3))].shape                                                                
Out[60]: (2, 3, 1)
In [61]: np.r_['0,3,-1', np.ones((2,3))].shape                                                               
Out[61]: (1, 2, 3)

===

使用ndmin第二个整数(所需的维数),每个数组都将扩展为:

newobj = array(item, copy=False, subok=True, ndmin=ndmin)

然后通过转置应用第三个整数。转置参数是用一段晦涩的代码计算的:

                k2 = ndmin - item_ndim
                k1 = trans1d
                if k1 < 0:
                    k1 += k2 + 1
                defaxes = list(range(ndmin))
                axes = defaxes[:k1] + defaxes[k2:] + defaxes[k1:k2]
                newobj = newobj.transpose(axes)

返回了两个版本,trans1d += k2+1,因此它从一个数组更改为另一个数组-从-5-3-1。最终尝试将(3,1)与(1,3)连接起来,从而引发ValueError。

我通过查看https://github.com/numpy/numpy/blame/master/numpy/lib/index_tricks.py文件的“怪”模式发现了此错误修复程序:

https://github.com/numpy/numpy/commit/e7d571396e92b670a0e8de6e50366ba1dbee3c6e

  

错误:修复np,r _

中项目之间的变异状态