【问题标题】:Creating an array of irregular numbers in Numpy在 Numpy 中创建一个不规则数字数组
【发布时间】:2015-04-30 17:42:05
【问题描述】:

如果我想在 Octave 中创建一个包含不规则、非线性数字集的数组(例如 12,然后以 5 为步长从 20 到 95,然后以 10 为步长从 100 到 190,然后以 200 到 500 25 步)我可以做到:

octave:1> nxtals = [12, 20:5:95, 100:10:190, 200:25:500]
nxtals =
Columns 1 through 13:
12    20    25    30    35    40    45    50    55    60    65    70    75
Columns 14 through 26:
80    85    90    95   100   110   120   130   140   150   160   170   180
Columns 27 through 39:
190   200   225   250   275   300   325   350   375   400   425   450   475
Column 40:
500

在 Numpy/Python3 中是否有一个优雅的 Pythonic(可能是 NumPythonic)等价物?如果我在 Python 中做一个范围列表,我会得到一个错误:

>>> q=[12, list(range(20, 50, 5)), list(range(50, 100, 10)),list(range(200,501,25))]
>>> numpy.array(q)
Traceback (most recent call last):
  File "<pyshell#55>", line 1, in <module>
    numpy.array(q)
ValueError: setting an array element with a sequence.

我怀疑我需要使用 numpy.ravel() 之类的东西,但似乎无法正常工作。

【问题讨论】:

    标签: arrays python-3.x numpy


    【解决方案1】:

    Numpy 定义了一个名为r_ 的对象,它可以做到这一点。它使用__getitem__ 方法来允许使用切片符号start:stop:step 来组装序列,因此您无需调用它,而是使用方括号。例如:

    In [1]: nxtals = np.r_[12, 20:100:5, 100:200:10, 200:525:25]
    
    In [2]: nxtals
    Out[2]: 
    array([ 12,  20,  25,  30,  35,  40,  45,  50,  55,  60,  65,  70,  75,
            80,  85,  90,  95, 100, 110, 120, 130, 140, 150, 160, 170, 180,
           190, 200, 225, 250, 275, 300, 325, 350, 375, 400, 425, 450, 475, 500])
    

    【讨论】:

      【解决方案2】:

      您可以使用np.hstack 将这些输入列表水平堆叠到单个一维数组中 -

      import numpy as np
      q = np.hstack( [[12], list(range(20, 50, 5)), list(range(50, 100, 10)),
                                                  list(range(200,501,25)) ] )
      

      示例运行 -

      In [295]: q = np.hstack( [[12], list(range(20, 50, 5)), list(range(50, 100, 10)),
           ...:                                                 list(range(200,501,25)) ] )
      
      In [296]: q
      Out[296]: 
      array([ 12,  20,  25,  30,  35,  40,  45,  50,  60,  70,  80,  90, 200,
             225, 250, 275, 300, 325, 350, 375, 400, 425, 450, 475, 500])
      

      【讨论】:

        猜你喜欢
        • 2018-09-21
        • 2017-12-27
        • 1970-01-01
        • 2021-10-26
        • 1970-01-01
        • 2017-12-30
        • 1970-01-01
        • 1970-01-01
        • 2017-03-17
        相关资源
        最近更新 更多