在 Numpy 中创建不规则数字数组



在八度中,如果我想创建一个包含不规则、非线性数字集的数组(例如 12,然后以 5 为步长从 20 到 95,然后以 10 为步长从 190 到 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()的东西,但似乎无法让它工作。

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])
您可以使用

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])

最新更新