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可以运行?
答案 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 _
中项目之间的变异状态