Numpy 负整数作为np.r\ux的第三个参数?(努比)

Numpy 负整数作为np.r\ux的第三个参数?(努比),numpy,Numpy,负整数指定在新形状元组中升级数组的最后一个维度应放置在何处,因此默认值为“-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]])

负整数指定在新形状元组中升级数组的最后一个维度应放置在何处,因此默认值为“-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,2,3]
因为数组具有形状(3,)。“2”表示将其扩展到2d(1,3)或(3,1)。第三个数字控制哪一个。它如何工作的细节有点复杂

您可以在
np.lib.index\u 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)
对于三维扩展,有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)
对于扩展到3d的(2,3)形状阵列,备选方案为(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)
k2=ndmin-项目
k1=trans1d
如果k1<0:
k1+=k2+1
defaxes=列表(范围(ndmin))
轴=defaxes[:k1]+defaxes[k2:]+defaxes[k1:k2]
newobj=newobj.转置(轴)
有几个版本回来了,
trans1d+=k2+1
,因此它从一个数组更改为下一个数组-
-5
-3
-1
。它最终尝试将(3,1)与(1,3)连接起来,导致ValueError

我通过查看文件的“责备”模式找到了此错误修复:

错误:修复np、r中项目之间的变异状态_


因此,在有限的范围内,它的行为类似于模量,尽管在计算中没有实际使用。我知道扩展过程<代码>在我的测试中,“0,2,1”类似于默认值,“0,2,-3”也是默认值。在中,默认值是正确的。换句话说,第三个整数允许您指定1在已升级其形状的阵列形状中的位置。默认情况下,它们放置在形状元组的前面。我不能理解
0,2,-3
。形状元组的长度是'2',为什么可以使用'-3',abs(-3)>2。甚至我们也可以在[6]中使用
np.r_['0,2,-1000001',[1,2,3],[4,5,6].shape
:np.r_['0,2,-5',[1,2,3],[4,5,6].shape-------------------------------------------------------ValueError Traceback(最近一次调用)In()--->1np.r_['0,2,-5',[1,2,3],[4,5,6]].shape~\Anaconda3\lib\site packages\numpy\lib\index\u tricks.py in\uuuuu getitem\uuuj(self,key)338 objs[k]=objs[k].astype(final\u dtype)339-->340 res=self.concatenate(元组(objs),axis=axis)341 342 if matrix:ValueError:所有输入数组
您的
numpy
版本是否已足够(1.15)受此错误影响:。甚至开发人员Eric W也承认
trans1d
的处理有点模糊。我的建议是——使用能给出期望结果的最小值,不要担心其他可能的值。
                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)