我在函数r_的numpy文档中阅读了以下内容:
字符串整数指定堆叠多个逗号的轴 分开的数组。一个由两个逗号分隔的整数组成的字符串 允许指示强制每个维度的最小维数 作为第二个整数进入(沿着连接的轴是 仍然是第一个整数。)
他们给出了这个例子:
>>> np.r_['0,2', [1,2,3], [4,5,6]] # concatenate along first axis, dim>=2
array([[1, 2, 3],
[4, 5, 6]])
我没有关注,字符串'0,2'
指示numpy做什么呢?
除了上面的链接之外,还有另一个网站有更多关于此功能的文档吗?
答案 0 :(得分:13)
'n,m'
告诉r_
沿axis=n
连接,并生成一个至少m
维的形状:
In [28]: np.r_['0,2', [1,2,3], [4,5,6]]
Out[28]:
array([[1, 2, 3],
[4, 5, 6]])
所以我们沿着轴= 0连接,因此我们通常希望结果具有形状(6,)
,但是从m=2
开始,我们告诉r_
形状必须是至少2维。所以我们得到了形状(2,3)
:
In [32]: np.r_['0,2', [1,2,3,], [4,5,6]].shape
Out[32]: (2, 3)
看看当我们增加m
时会发生什么:
In [36]: np.r_['0,3', [1,2,3,], [4,5,6]].shape
Out[36]: (2, 1, 3) # <- 3 dimensions
In [37]: np.r_['0,4', [1,2,3,], [4,5,6]].shape
Out[37]: (2, 1, 1, 3) # <- 4 dimensions
您可以使用r_
,np.concatenate
,np.row_stack
,{{1}等更易读的数组构建函数来完成您对np.column_stack
所做的任何事情。 }},np.hstack
或np.vstack
,但也可能需要调用np.dstack
。
即使调用重塑,其他功能甚至可能更快:
reshape
答案 1 :(得分:3)
字符串&#39; 0,2&#39;告诉numpy沿轴0(第一个轴)连接并将元素包装在足够的括号中以确保二维数组。请考虑以下结果:
for axis in (0,1):
for minDim in (1,2,3):
print np.r_['{},{}'.format(axis, minDim), [1,2,30, 31], [4,5,6, 61], [7,8,90, 91], [10,11, 12, 13]], 'axis={}, minDim={}\n'.format(axis, minDim)
[ 1 2 30 31 4 5 6 61 7 8 90 91 10 11 12 13] axis=0, minDim=1
[[ 1 2 30 31]
[ 4 5 6 61]
[ 7 8 90 91]
[10 11 12 13]] axis=0, minDim=2
[[[ 1 2 30 31]]
[[ 4 5 6 61]]
[[ 7 8 90 91]]
[[10 11 12 13]]] axis=0, minDim=3
[ 1 2 30 31 4 5 6 61 7 8 90 91 10 11 12 13] axis=1, minDim=1
[[ 1 2 30 31 4 5 6 61 7 8 90 91 10 11 12 13]] axis=1, minDim=2
[[[ 1 2 30 31]
[ 4 5 6 61]
[ 7 8 90 91]
[10 11 12 13]]] axis=1, minDim=3
答案 2 :(得分:1)
您突出显示的段落是两个逗号分隔的整数语法,这是三个逗号分隔的语法的特例。一旦了解了三种逗号分隔的语法,两种逗号分隔的语法就会就位。
对于您的示例,等效的三个逗号分隔的整数语法为:
np.r_['0,2,-1', [1,2,3], [4,5,6]]
为了提供更好的解释,我将以上内容更改为:
np.r_['0,2,-1', [1,2,3], [[4,5,6]]]
以上分为两部分:
用逗号分隔的整数字符串
两个逗号分隔的数组
以逗号分隔的数组具有以下形状:
np.array([1,2,3]).shape
(3,)
np.array([[4,5,6]]).shape
(1, 3)
换句话说,第一个“数组”是“一维”,而第二个“数组”是“二维”。
首先,2
中的0,2,-1
意味着每个array
都应升级,因此必须至少为2-dimensional
。由于第二个array
已经是2-dimensional
,因此不受影响。但是第一个array
是1-dimensional
,为了使其2-dimensional
np.r_
需要在其形状tuple
上加上1以使其{{1 }}或(1,3)
。这就是(3,1)
中的-1
发挥作用的地方。基本上,它决定将多余的1以0,2,-1
的形状tuple
放置在何处。 array
是默认设置,并将-1
(如果需要更多尺寸,则放置1
)在形状1s
的前面(我在下面进一步解释了原因)。这会将第一个tuple
形状array's
变成tuple
,与第二个(1,3)
形状array's
相同。 tuple
中的0
意味着需要沿'0'轴连接结果数组。
由于两个0,2,-1
现在都具有arrays
的形状tuple
,因此可以串联,因为如果搁置串联轴(在上面的示例中,尺寸0的值为1)在两个(1,3)
中,其余维度都相等(在这种情况下,两个arrays
中的剩余维度值为3)。如果不是这种情况,则会产生以下错误:
ValueError:除串联轴外,所有输入数组维都必须完全匹配
现在,如果您串联两个形状为arrays
的{{1}},则结果arrays
将具有形状(1,3)
,因此:
array
当将(1+1,3) == (2,3)
或正整数用于逗号分隔的字符串中的第三个整数时,该整数确定升级形状np.r_['0,2,-1', [1,2,3], [[4,5,6]]].shape
(2, 3)
中每个0
形状元组的开始(仅适用于需要升级其尺寸的array's
)。例如,tuple
意味着对于需要进行形状升级的arrays
,0,2,0
原始形状arrays
应该从升级形状array's
的尺寸0开始。对于形状为tuple
tuple
的{{1}} array
,[1,2,3]
将放置在tuple
之后。这将导致形状(3,)
等于1
,并且您可以看到原始形状3
tuple
始于升级形状{{ 1}}。 (3,1)
表示对于tuple
,(3,)
形状0
tuple
应该从升级形状元组的尺寸1开始。这意味着需要将1放置在尺寸0处。生成的形状元组将为0,2,1
。
当负号用于逗号分隔的字符串中的第三个整数时,负号后的整数确定原始形状元组应在何处结束。当原始形状元组为[1,2,3]
array's
时,意味着原始形状元组应在升级形状元组的最后一个维度结束,因此1将放置在升级形状元组的尺寸0处,而升级后的形状元组为tuple
。现在(3,)
结束于升级形状元组的维度1,这也是升级形状元组的最后一个维度(原始数组为(1,3)
,升级数组为(3,)
)。
0,2,-1
与
相同(1,3)
最后,这是一个具有更大尺寸的示例:
(3,)
用逗号分隔的数组是:
[1,2,3]
,它具有形状元组[[1,2,3]]
np.r_['0,2', [1,2,3], [4,5,6]]
,它具有形状元组np.r_['0,2,-1', [1,2,3], [4,5,6]]
np.r_['2,4,1',[[1,2],[4,5],[10,11]],[7,8,9]].shape
(1, 3, 3, 1)
都需要升级到[[1,2],[4,5],[10,11]]
。原始(3,2)
形元组需要从维度1开始。
因此,对于第一个数组,形状是[7,8,9]
,因为(3,)
从维度1开始,并且由于需要添加两个1来使其arrays
成为一个{1}元组和1个1之后。
使用相同的逻辑,第二个数组的形状元组变为4-dimensional arrays
。
现在需要使用维度2作为并置轴来对两个array's
进行连接。从每个数组的升级形状元组中消除维度2会导致两个(1,3,2,1)
的元组3,2
。由于生成的元组相同,因此可以将数组连接起来,并将连接后的轴相加得出4-dimensional
。