理解numpy.r_()连接的语法

时间:2013-01-22 21:16:09

标签: python numpy concatenation

我在函数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做什么呢?

除了上面的链接之外,还有另一个网站有更多关于此功能的文档吗?

3 个答案:

答案 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.concatenatenp.row_stack,{{1}等更易读的数组构建函数来完成您对np.column_stack所做的任何事情。 }},np.hstacknp.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]]]

以上分为两部分:

  1. 用逗号分隔的整数字符串

  2. 两个逗号分隔的数组

以逗号分隔的数组具有以下形状:

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,因此不受影响。但是第一个array1-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意味着对于需要进行形状升级的arrays0,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