字符串在numpy.r_中的含义是什么?

时间:2017-10-20 01:47:03

标签: python numpy

在numpy' documents中:

>>> np.r_['0,2,0', [1,2,3], [4,5,6]]
array([[1],
       [2],
       [3],
       [4],
       [5],
       [6]])

字符串中的第三个数字是什么意思' 0,2,0'?

3 个答案:

答案 0 :(得分:1)

我还没有使用r_的字符串参数;对我来说,直接使用concatanate及其variantes更容易。

但是看看文档:

  

具有三个以逗号分隔的整数的字符串允许指定   轴要连接,要强制的最小维数   条目,以及哪个轴应包含数组的开头   小于指定的维数。

'0.2.0'
 axis = 0
 make it 2d
 start with 0d

In [79]: np.r_['0,2,0', [1,2,3], [4,5,6]]
Out[79]: 
array([[1],
       [2],
       [3],
       [4],
       [5],
       [6]])

连接等效

In [80]: np.concatenate(([1,2,3], [4,5,6]))
Out[80]: array([1, 2, 3, 4, 5, 6])
In [81]: np.concatenate(([1,2,3], [4,5,6]))[:,None]
Out[81]: 
array([[1],
       [2],
       [3],
       [4],
       [5],
       [6]])

这里我在轴= 0上连接,并在连接后扩展到2d。但听起来r_首先扩展元素的维度(但我们可以仔细检查代码)。

In [83]: alist = ([1,2,3], [4,5,6]) 
In [86]: [np.expand_dims(a,1) for a in alist]
Out[86]: 
[array([[1],
        [2],
        [3]]), array([[4],
        [5],
        [6]])]
In [87]: np.concatenate(_, axis=0)
Out[87]: 
array([[1],
       [2],
       [3],
       [4],
       [5],
       [6]])

我使用expand_dims制作输入2 d,并在第一个之后添加新尺寸。完成后我可以在轴0上连接。

请注意r_的输入可能已经是2d,如:

np.r_['0,2,0',[1,2,3], [[4],[5],[6]]]
np.r_['0,2,0',[1,2,3], np.expand_dims([4,5,6],1)]
np.r_['0,2,0',[1,2,3], np.atleast_2d([4,5,6]).T]

3d数字(如果为1)将组件转换为

In [105]: np.atleast_2d([4,5,6])
Out[105]: array([[4, 5, 6]])

In [103]: np.r_['0,2,1',[1,2,3],[4,5,6]]
Out[103]: 
array([[1, 2, 3],
       [4, 5, 6]])

通常,如果文档不清楚,我想深入研究代码,或尝试替代输入。

In [107]: np.r_['1,2,1',[1,2,3], [4,5,6]]
Out[107]: array([[1, 2, 3, 4, 5, 6]])
In [108]: np.r_['1,2,0',[1,2,3], [4,5,6]]
Out[108]: 
array([[1, 4],
       [2, 5],
       [3, 6]])

查看代码,我看到它使用

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

将组件扩展到所需的ndmin。 3d数字用于构造transpose参数。细节很混乱,但效果如下:

In [111]: np.array([1,2,3], ndmin=2)
Out[111]: array([[1, 2, 3]])
In [112]: np.array([1,2,3], ndmin=2).transpose(1,0)
Out[112]: 
array([[1],
       [2],
       [3]])

答案 1 :(得分:0)

enter image description here

谢谢你的所有答案!现在,我想我对这个问题有了更好的理解。所以,我绘制了思维导图。如果我错了,请纠正我。 作为Python的初学者,我正在努力学习更多,并思考更多。最后,我要为我可怜的英语道歉。

答案 2 :(得分:0)

'0,2,0'是三个逗号分隔的字符串。与numpy.r_一起使用时,每个元素分别指定:

  1. 将哪个维度用作串联轴
  2. 每个数组需要的最小维数是多少?如果数组的尺寸小于此处指定的数字,则numpy.r_通过在其形状元组中加1来升级该数组的形状元组。
  3. 如果需要升级,如何添加额外的尺寸

对于第三个元素,您有两个选择:

  1. 0或正整数
  2. 一个负整数

如果使用0或正整数,则指定原始形状元组应在数组的升级形状元组的维中的何处开始。例如,0表示原始形状元组应从升级形状元组的尺寸0开始。

如果使用负数,则负号后的整数指定原始形状元组应在数组升级形状元组的维中的何处结束。例如,-1表示原始形状元组应在升级形状元组的最后一个维度结束。 -2表示相同,但​​倒数第二个。

最后,将以上内容应用于您的示例。

np.r_['0,2,0', [1,2,3], [4,5,6]]

上面包含两个数组。每个都有一个维度(3,),这意味着它们都是一维数组。逗号分隔的整数字符串中的第二个元素是2,这意味着每个数组的维数至少应为2。由于两个数组都是一维的,因此它们都需要在其形状元组中增加一个维。逗号分隔的整数字符串中的第三个元素是0,这意味着原始形状元组(两个数组均为(3,))需要从形状元组的维度0开始升级的阵列。这是通过在原始形状元组的末尾添加1来实现的。这会将两个数组都升级为具有(3,1)形状的元组。现在,由于逗号分隔的整数字符串的第一个元素是0,因此将使用维度0作为连接轴来连接升级后的数组。这意味着,如果为两个升级后的阵列预留了维度0,则其余维度必须相同。在此示例中,如果在两个升级的阵列中都未设置维度0,则仅保留维度1,并且对于两个升级的阵列,维度1的值为1。因此,当连接两个升级的数组时,结果将具有(3 + 3,1)==(6,1)的形状元组,其形状为

array([[1],
   [2],
   [3],
   [4],
   [5],
   [6]])