代码之家  ›  专栏  ›  技术社区  ›  kmario23 Mazdak

解释NumPy RClass(`np.r\u`)中步长中的复数

  •  0
  • kmario23 Mazdak  · 技术社区  · 7 年前

    np.concatenate(([3], [0]*5, np.arange(-1, 1.002, 2/9.0)))
    
    # the above outputs 
    array([ 3.        ,  0.        ,  0.        ,  0.        ,  0.        ,
            0.        , -1.        , -0.77777778, -0.55555556, -0.33333333,
           -0.11111111,  0.11111111,  0.33333333,  0.55555556,  0.77777778,
            1.        ])
    

    虽然这很冗长,但还是可以理解的。这里还有另一种方法,用(ab)表示法得到相同的输出,用复数作为步长。

    np.r_[3, [0]*5, -1:1:10j]
    
    # the above outputs
    array([ 3.        ,  0.        ,  0.        ,  0.        ,  0.        ,
            0.        , -1.        , -0.77777778, -0.55555556, -0.33333333,
           -0.11111111,  0.11111111,  0.33333333,  0.55555556,  0.77777778,
            1.        ])
    

    我试图理解第一种方法中的步长如何与复数步长相等( 10j )第二种方法。

    2/9.0  == 10j  # how?
    

    scipy reference documentation 那个 -1:1:10j 意味着我们要在 -1:1 ,包括两边。但是,这是怎么回事 10焦耳 翻译成 0.2222 ?

    • 另外,我们可以用这种表达式来做其他有用的NumPy示例吗?

    P、 我已经看过了 range-builder-r-slice-with-complex-but-not-imaginary-step-magnitude

    0 回复  |  直到 7 年前
        1
  •  1
  •   kmario23 Mazdak    7 年前

    当你有 start , stop size ,那么 step 计算如下:

    step = (stop - start) / (size - 1)
    

    与 start = -1 stop = 1 , size = 2 你会得到 step = 2 [-1, 1]

    与 开始=-1 停止=1 , size = 3 你会得到 step = 1 [-1, 0, 1]

    与 开始=-1 , , size = 10 从切片上看 -1:1:10j step = 2/9 和阵列

    [-1.        , -0.77777778, -0.55555556, -0.33333333, -0.11111111,
      0.11111111,  0.33333333,  0.55555556,  0.77777778,  1.        ]
    

    :对于复数,例如 10j

        2
  •  2
  •   hpaulj    7 年前

    相关部分 r_

    但是,如果 step 是一个虚数(即100j),则其整数部分为 解释为所需的多个点,开始和停止是 包容的。换句话说 start:stop:stepj 解释为 np.linspace(start, stop, step, endpoint=1)

    这是在一些 班级 在里面 numpy/lib/index_tricks.py mgrid 是另一个)。这不是将军 numpy 或者蟒蛇的把戏。使用 class __getitem__

    至于数字细节,请检查代码 np.linspace . (MATLAB有一个同名函数)。

    arange 有助于给人一种直观的感觉。

    In [65]: np.arange(-1,1.01,.2)                                                  
    Out[65]: 
    array([-1.00000000e+00, -8.00000000e-01, -6.00000000e-01, -4.00000000e-01,
           -2.00000000e-01, -2.22044605e-16,  2.00000000e-01,  4.00000000e-01,
            6.00000000e-01,  8.00000000e-01,  1.00000000e+00])
    In [66]: _.shape                                                                
    Out[66]: (11,)
    In [67]: np.linspace(-1,1,11)                                                   
    Out[67]: array([-1. , -0.8, -0.6, -0.4, -0.2,  0. ,  0.2,  0.4,  0.6,  0.8,  1. ])
    

    阿兰奇 产生了11个值,所以我们必须在 linspace . 请注意 林空间 对端点的处理更好,从而使浮点值的显示更清晰(这两种情况都不精确)。

    如果改用10,则间距是正确的(.2222…*9=1.9999….)。要得到10个值,我们必须步进9次。或者把范围分成9个区间。

    In [68]: np.linspace(-1,1,10)                                                   
    Out[68]: 
    array([-1.        , -0.77777778, -0.55555556, -0.33333333, -0.11111111,
            0.11111111,  0.33333333,  0.55555556,  0.77777778,  1.        ])
    

    阿兰奇 使用float比以整数开头的等效值更混乱:

    In [70]: np.arange(-10,11,2)/10                                                 
    Out[70]: array([-1. , -0.8, -0.6, -0.4, -0.2,  0. ,  0.2,  0.4,  0.6,  0.8,  1. ])