【问题标题】:What does the c underscore expression `c_` do exactly?c 下划线表达式 `c_` 究竟做了什么?
【发布时间】:2012-06-05 08:56:58
【问题描述】:

这似乎是某种水平连接,但我在网上找不到任何文档。这是一个最小的工作示例:

In [1]: from numpy import c_
In [2]: a = ones(4)
In [3]: b = zeros((4,10))    
In [4]: c_[a,b]
Out[4]: 
array([[ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

【问题讨论】:

  • 重要提示:在 IPython 中,您可以使用 ? 获取有关任何对象的更多信息。尝试运行c_?
  • @ThomasK,谢谢,这正是我所需要的。 C_?为我提供了所有信息。您可以发布答案以便我选择它吗?
  • 最简单的参考是 numpy 手册:docs.scipy.org/doc/numpy/reference/generated/numpy.c_.html(适用于所有不使用 IPython 的人)。
  • 或在其他解释器中调用help(c_)
  • 如果有np.c_np.c 之间的区别,最好解释一下。两者都说:“This is short-hand for np.r_['-1,2,0', index expression]”指的是np.r_

标签: python numpy


【解决方案1】:

使用 IPython 的 ? 语法获取更多信息:

In [2]: c_?
Type:       CClass
Base Class: <class 'numpy.lib.index_tricks.CClass'>
String Form:<numpy.lib.index_tricks.CClass object at 0x9a848cc>
Namespace:  Interactive
Length:     0
File:       /usr/lib/python2.7/dist-packages/numpy/lib/index_tricks.py
Docstring:
Translates slice objects to concatenation along the second axis.

This is short-hand for ``np.r_['-1,2,0', index expression]``, which is
useful because of its common occurrence. In particular, arrays will be
stacked along their last axis after being upgraded to at least 2-D with
1's post-pended to the shape (column vectors made out of 1-D arrays).

For detailed documentation, see `r_`.

Examples
--------
>>> np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])]
array([[1, 2, 3, 0, 0, 4, 5, 6]])

【讨论】:

  • 伙计,我什至无法猜测早点认识这个简单的? 会节省多少时间。
  • -1 因为文档需要进一步阐述。 “将切片对象转换为连接” => 给出的示例根本不使用切片对象。我们如何理解这一点?
【解决方案2】:

我花了很长时间才明白,但似乎我终于明白了。

您所要做的就是沿第二个轴添加。

让我们开始吧:

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

但是没有第二个轴。所以我们在心里加一个。

所以两个数组的形状都变成了(3,1)

因此结果形状将是 (3,1+1),即 (3,2)。 这是结果的形状 -

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

另一个例子:

np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])]

形状:

np.array([[1,2,3]]) = 1,3

np.array([[4,5,6]]) = 1,3

0 所以我们可以把它想象成[[0]] = 1,1

所以结果1,3+1+1+3 = 1,8

这是结果的形状:array([[1, 2, 3, 0, 0, 4, 5, 6]])

【讨论】:

  • 注意第二个轴是水平轴
【解决方案3】:

我将解释如下。它将您的第一个数组连接到函数中最后一个数组的最后一个维度(轴)

例如:

# both are 2 dimensional array
a = array([[1, 2, 3], [4, 5, 6]])
b = array([[7, 8, 9], [10, 11, 12]])

现在,我们来看看np.c_(a, b)

首先,我们来看看形状:

a 和 b 的形状都是(2, 3)。将a(2, 3)拼接到b(3)的最后一个轴上,同时保持其他轴不变(1)会变成

(2, 3 + 3) = (2, 6)

这是新的形状。

现在,让我们看看结果:

在b中,最后一个轴的2项是:

1st: [7, 8, 9]
2nd: [10, 11, 12]

加一个表示:

1st item: [1,2,3] + [7,8,9] = [1,2,3,7,8,9]
2nd item: [4,5,6] + [10,11,12] = [4,5,6,10,11,12]

所以,结果是

[
  [1,2,3,7,8,9],
  [4,5,6,10,11,12]
]

它的形状是(2, 6)

【讨论】:

  • 这是最好的解释。感谢您以这种方式分解它。
【解决方案4】:

它将几个 1D 数组转换为 2D 数组,原始数组的一维保留为 2D 数组的第 1 维。多个输入数组用作第二维。

这样想:如果您将 30 条记录的数据系列收集到单独的一维数组中,np.c_ 会像在 excel 表中一样组合这些系列:并排在单独的 30 列中,而不是而不是扩展第一个系列。

例如,2个起始数组:

>>> arrayX = np.array([X1,X2...,X30])
array([X1, X2..., X30])
>>> arrayY = np.array([Y1,Y2...,Y30])
array([Y1, Y2..., Y30])

让我们看看np.c_如何组合它们:

>>>arrayC = np.c_(arrayX, arrayY)
array([[X1, Y1],
       [X2, Y2],
       ...
       [X30, Y30]])

看看它仍然有 30 条记录吗?您现在可以使用第二维度在数据系列之间导航。

documentation 有点含糊地说:“将切片对象转换为沿第二个轴的连接。” 第二轴是什么? 生成的二维数组,他们的意思。不清楚您是否不知道这是np.r_ 的变体,它沿第一个轴连接;如果您不认为一维数组 具有 另一个维度。但从句法上讲,确实如此。

查询数组的形状来说明这一点:

>>> np.shape(arrayX)
(30,)
>>> np.shape(arrayY)
(30,)
>>> np.shape(arrayC)
(30,2)

您可以看到第二个维度或轴是由np.c_ 方法创建的,并且连接发生在那里。相比之下:

>>> arrayR = np.r_[array1,array2]
array([X1, X2..., X30, Y1, Y2..., Y30])
>>> np.shape(arrayR)
(60,)

np.r_ 方法在第一个维度内或沿第一个轴连接。

【讨论】:

    【解决方案5】:

    使用 numpy 连接数组的一种简短技术是 np.c_ 和 np.r_

    np.c_[] 沿第二个轴连接数组 但是,np.r_[] 沿第一个轴连接数组

    假设:

    import numpy as np
    a = np.array([[1,2,3],
                 [11,22,33]]
                 )
    b = np.array([[4,5,6],
                 [44,55,66]]
                 )
    

    a 的形状:(2,3) 即(行数,列数)也 =(第 1 轴,第 2 轴)

    b 的形状:(2,3) 即(第 1 轴,第 2 轴)

    np.r_ 沿第一个轴连接 所以 np.r_[a,b] 给出:

    array([[ 1,  2,  3],
           [11, 22, 33],
           [ 4,  5,  6],
           [44, 55, 66]])
    

    即沿行(第一轴)连接,所以这里的行数会增加。

    虽然 np.c_[a,b] 沿第二轴连接,即此处的列如下:

    array([[ 1,  2,  3,  4,  5,  6],
           [11, 22, 33, 44, 55, 66]])
    

    【讨论】:

    • 谢谢!我发现你的答案最容易理解!
    【解决方案6】:

    其实它不是一个函数,它是CClass类的一个对象。

    it is "not a function, so takes no parameters
    

    以上是官方文档所说的。您可以查看此问题以了解详细信息。

    numpy.r_ is not a function. What is it?

    【讨论】:

      【解决方案7】:

      例如:

      我有 2 个数组的值:
      a = [x1,x2,x3]
      b = [y1,y2,y3]

      我们想将它们合并在一起,我们有类似的东西:[[x1, y1],[x2, y2],[x3, y3]]

      因此我们使用numpy.c_[a, b]

      import numpy
      
      a = [1,2,3]
      b = [4,5,6]  
      value = numpy.c_[a,b]
      
      print(value)
      # [
      #  [1, 4],
      #  [2, 5],
      #  [3, 6]
      # ]
      

      【讨论】:

        【解决方案8】:

        np.c_[[1,4,5,4,5,3],[1,4,2,4,5,3],[2,4,6,8,9,0]]。 .这将数组水平连接或按轴0表示。所以数组将是

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

        确定行, 元素总数/数组总数

        (即 18/3) [{len([1,4,5,4,5,3])}+{len([1,4,5,4,5,3])}+{len([2,4,6,8 ,9,0])}]//len([[1,4,5,4,5,3],[1,4,2,4,5,3],[2,4,6,8, 9,0]])

        所以上面的人给了 6..SO 6 行将在那里。

        对于列数, Total Elements/len(数组内任意一个数组)

        例如 18/len([1,4,5,4,5,3])

        所以列将是 18/6,即 3。

        【讨论】:

        • 欢迎来到 SO!当您要回答一个已经有公认答案的老问题(这个问题已经超过 8 年了)时(这里就是这种情况,包括其他几个问题),请问问自己:我真的有实质性的改进吗?如果没有,请考虑不要回答。关于您的回答:您的部分代码无效。而不是计算,您可以简单地使用a.shapea 来自np.c_... 的结果数组)?
        猜你喜欢
        • 1970-01-01
        • 2012-11-19
        • 2015-07-08
        • 2012-07-23
        • 2016-09-10
        • 2023-03-15
        • 2012-10-17
        • 2021-06-04
        • 1970-01-01
        相关资源
        最近更新 更多