zoukankan      html  css  js  c++  java
  • [机器学习]numpy broadcast shape 机制

    最近在做机器学习的时候,对未知对webshell检测,发现代码提示:ValueError: operands could not be broadcast together with shapes (1,3) (37660,) 

    查阅了很多资料都在提示shape不一致,违反了ufunc机制。

    但是初学,不是很了解,查阅了大量的资料还是很不了解。

    查看官网文档后,有了很好的理解。

    6.4. Broadcasting

    Another powerful feature of Numpy is broadcasting. Broadcasting takes place when you perform operations between arrays of different shapes. For instance

    >>> a = np.array([
        [0, 1],
        [2, 3],
        [4, 5],
        ])
    >>> b = np.array([10, 100])
    >>> a * b
    array([[  0, 100],
           [ 20, 300],
           [ 40, 500]])

    The shapes of a and b don’t match. In order to proceed, Numpy will stretch b into a second dimension, as if it were stacked three times upon itself. The operation then takes place element-wise.

    One of the rules of broadcasting is that only dimensions of size 1 can be stretched (if an array only has one dimension, all other dimensions are considered for broadcasting purposes to have size 1). In the example above b is 1D, and has shape (2,). For broadcasting with a, which has two dimensions, Numpy adds another dimension of size 1 to bb now has shape (1, 2). This new dimension can now be stretched three times so that b’s shape matches a’s shape of (3, 2).

    The other rule is that dimensions are compared from the last to the first. Any dimensions that do not match must be stretched to become equally sized. However, according to the previous rule, only dimensions of size 1 can stretch. This means that some shapes cannot broadcast and Numpy will give you an error:

    >>> c = np.array([
        [0, 1, 2],
        [3, 4, 5],
        ])
    >>> b = np.array([10, 100])
    >>> c * b
    ValueError: operands could not be broadcast together with shapes (2,3) (2,)

    What happens here is that Numpy, again, adds a dimension to b, making it of shape (1, 2). The sizes of the last dimensions of b and c (2 and 3, respectively) are then compared and found to differ. Since none of these dimensions is of size 1 (therefore, unstretchable) Numpy gives up and produces an error.

    The solution to multiplying c and b above is to specifically tell Numpy that it must add that extra dimension as the second dimension of b. This is done by using None to index that second dimension. The shape of b then becomes (2, 1), which is compatible for broadcasting with c:

    >>> c = np.array([
        [0, 1, 2],
        [3, 4, 5],
        ])
    >>> b = np.array([10, 100])
    >>> c * b[:, None]
    array([[  0,  10,  20],
           [300, 400, 500]])

    A good visual description of these rules, together with some advanced broadcasting applications can be found in this tutorial of Numpy broadcasting rules.

    其实就是维度不一样,numpy用了很多的ufunc,所以在解决这类问题的时候,需要把维度进行统一。

    参考资料:http://howtothink.readthedocs.io/en/latest/PvL_06.html

  • 相关阅读:
    requestWindowFeature()的应用(转载)
    Android美工坊selector选择器的使用(转载)
    Activity强制横屏竖屏
    ActivityGroup的简单用法(2)Demo展示讲解
    AndroidGUI25:定制Activity的标题栏(Titlebar)(转载)
    android背景选择器selector用法汇总
    eclipse的注释字体大小如何修改?不改变代码的字体
    QML基础——QML国际化(中文示例)
    QML基础——在C++程序中使用QML
    App for Android (4) —— Eclipse篇
  • 原文地址:https://www.cnblogs.com/sevck/p/8951494.html
Copyright © 2011-2022 走看看