【问题标题】:confused about numpy.c_ document and sample code对 numpy.c_ 文档和示例代码感到困惑
【发布时间】:2017-01-01 09:08:51
【问题描述】:

我多次阅读有关 numpy.c_ 的文档,但仍然感到困惑。据说——“将切片对象转换为沿第二个轴的串联。”在以下文档中。谁能在下面的示例中澄清一下,什么是切片对象,什么是第二轴?我看到它们都是一维的,并且混淆了第二轴的来源。

在 Windows 上使用 Python 2.7。

http://docs.scipy.org/doc/numpy-1.6.0/reference/generated/numpy.c_.html#numpy.c_

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

【问题讨论】:

    标签: python python-2.7 numpy machine-learning


    【解决方案1】:

    np.c_ 是另一种进行数组连接的方式

    In [701]: np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])]
    Out[701]: array([[1, 2, 3, 0, 0, 4, 5, 6]])
    
    In [702]: np.concatenate([np.array([[1,2,3]]), [[0]], [[0]], np.array([[4,5,6]])], 
         axis=1)
    Out[702]: array([[1, 2, 3, 0, 0, 4, 5, 6]])
    

    两种情况下的输出形状都是(1,8);连接在轴 = 1 上,即第二轴。

    c_ 负责将0 的维度扩展到np.array([[0]]),即需要连接的2d (1,1)。

    np.c_(和np.r_)实际上是一个带有__getitem__ 方法的类对象,所以它使用[] 语法。 numpy/lib/index_tricks.py 源文件具有指导意义。

    请注意,row 版本使用 : 切片语法,生成一个 1d (8,) 数组(相同的数字,但在 1d 中)

    In [706]: np.r_[1:4,0,0,4:7]
    Out[706]: array([1, 2, 3, 0, 0, 4, 5, 6])
    In [708]: np.concatenate((np.arange(4),[0],[0],np.arange(4,7)))
    Out[708]: array([0, 1, 2, 3, 0, 0, 4, 5, 6])
    In [710]: np.hstack((np.arange(4),0,0,np.arange(4,7)))
    Out[710]: array([0, 1, 2, 3, 0, 0, 4, 5, 6])
    

    np.c_ 是一种方便,但不是您必须理解的。我认为能够直接使用concatenate 更有用。它迫使您明确考虑输入的维度。

    [[1,2,3]] 实际上是一个列表——一个包含一个列表的列表。 np.array([[1,2,3]]) 是一个形状为 (1,3) 的二维数组。 np.arange(1,4) 产生一个具有相同数字的 (3,) 数组。 np.arange(1,4)[None,:] 使其成为 (1,3) 数组。

    slice(1,4) 是一个切片对象。 np.r_np.c_ 可以将切片对象转换为数组 - 通过实际使用 np.arange

    In [713]: slice(1,4)
    Out[713]: slice(1, 4, None)
    In [714]: np.r_[slice(1,4)]
    Out[714]: array([1, 2, 3])
    In [715]: np.c_[slice(1,4)]   # (3,1) array
    Out[715]: 
    array([[1],
           [2],
           [3]])
    In [716]: np.c_[1:4]   # equivalent with the : notation
    Out[716]: 
    array([[1],
           [2],
           [3]])
    

    回到最初的例子(这可能不是最好的):

    In [722]: np.c_[[np.r_[1:4]],0,0,[np.r_[4:7]]]
    Out[722]: array([[1, 2, 3, 0, 0, 4, 5, 6]])
    

    ===========

    In [731]: np.c_[np.ones((5,3)),np.random.randn(5,10)].shape
    Out[731]: (5, 13)
    

    对于np.c_,两者的第一个维度需要匹配。

    learn 示例中,n_samplesX(行)的第一个暗点,randn 也需要有那么多行。

    n_samples, n_features = X.shape
    X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]
    

    np.concatenate([(X, randn(n_samples...)], axis=1) 在这里应该也能正常工作。有点啰嗦,但功能相同。

    【讨论】:

    • 感谢 hpaulj,很好的回复并投票。其实我的困惑来自这个样本,参考这条线X = np.c_[X, random_state.randn(n_samples, 200 * n_features)],实际上X的形状是150 * 4,但是random_state.randn会生成一些标量随机数属于正态分布,它们是如何连接在一起的,我想按顺序要与 X 连接,我们需要 150 * some_number_of_columns 的形状,对吗? scikit-learn.org/stable/auto_examples/model_selection/…
    • 对,n_samplesX 的第一个维度,所以它们会在正确的维度上匹配。 Xrandn 的列数可以不同。
    • 感谢 hpaulj,我认为 X 是 150 * 4 的形状,random_state.randn(n_samples, 200 * n_features) 怎么会输出 150 * 4 的形状?我知道n_samples 是 150,但是这 4 个部分是从哪里来的?
    • 小心,150*4的形状?是 (150*4,) 还是 (150,4)? 1d 还是 2?在200*n_features 中,它们的意思是乘法。 X 的第一个维度是 n_samples。这就是n_samples 的定义方式。
    • 感谢 hpaulj,已调试,似乎 random_state.randn(n_samples, 200 * n_features) 可以提供 (150, 800) 形状?有点困惑,根据我对random_state.randn 的经验,它只接受一个参数,第二个参数对random_state.randn 意味着什么?我发现它不接受来自random_state.randns numpy 文档页面的另一个参数。
    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2012-10-05
    • 2017-01-03
    • 1970-01-01
    相关资源
    最近更新 更多