在python中编写[1:20,25:30]的最有效方法是什么?

时间:2018-05-14 05:19:41

标签: python python-3.x matlab numpy

matlab 中,我们可以使用[1:20,25:30]编写1到30之间的列表,不包括21-24。 在python中最有效的方法是什么?

另一个问题是,是否有一种有效的方法可以删除列表中的一个元素或python中 ndarray 中的列?与 matlab 中的相同,只需设置A[:,1]=[]

即可

2 个答案:

答案 0 :(得分:2)

在MATLAB / Octave中

[1:20,25:30]

发生了3件事 - 1:2025:30生成矩阵,[ ]将它们合并为一个矩阵。

>> [1:20,25:30]
ans =
 Columns 1 through 16:
    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
 Columns 17 through 26:
   17   18   19   20   25   26   27   28   29   30
>> A = 1:20;
>> B = 25:30;
>> [A, B]
ans =
 Columns 1 through 16:
    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16
 Columns 17 through 26:
   17   18   19   20   25   26   27   28   29   30

numpy中的等价物:

In [193]: A = np.arange(1,21);
In [194]: B = np.arange(25,31);
In [195]: np.concatenate((A,B))
Out[195]: 
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
       18, 19, 20, 25, 26, 27, 28, 29, 30])

还有其他功能做同样的事情,但最终都使用concatenatenp.blocknp.hstacknp.r_等。concatenate是最基本的功能numpy函数用于沿一个维度或另一个维度连接数组。

在Python中,您可以使用类似的语法从列表中删除元素:

In [201]: alist = list(range(10))
In [202]: alist
Out[202]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [203]: alist[3:6] = []
In [204]: alist
Out[204]: [0, 1, 2, 6, 7, 8, 9]

但这不适用于numpy数组。它们的大小是固定的。您可以做的最好的事情是创建一个没有选定部分的新列表。有一个np.delete为你做,但它是一种方便而不是速度工具。

In [205]: arr = np.arange(10)
In [207]: np.delete(arr, slice(3,6))
Out[207]: array([0, 1, 2, 6, 7, 8, 9])

delete根据删除对象执行各种操作。我想在这种情况下它会将切片复制到一个新的数组

In [208]: res = np.zeros(10-3, arr.dtype)
In [209]: res[:3]=arr[:3]
In [210]: res[3:]=arr[6:]
In [211]: res
Out[211]: array([0, 1, 2, 6, 7, 8, 9])

或者只是:

In [212]: np.concatenate([arr[:3], arr[6:]])
Out[212]: array([0, 1, 2, 6, 7, 8, 9])

特别是如果删除值是列表而不是切片,delete使用mask

In [213]: mask = np.ones(arr.shape, dtype=bool)
In [214]: mask[3:6]=0
In [215]: mask
Out[215]: 
array([ True,  True,  True, False, False, False,  True,  True,  True,
        True])
In [216]: arr[mask]
Out[216]: array([0, 1, 2, 6, 7, 8, 9])

通过将更多动作移动到编译代码,MATLAB可以更快地完成其中的一些工作。但我认为逻辑将是相似的。

答案 1 :(得分:0)

如果使用具有单字母名称的函数,Python中最有效的方法只有一个字符:

l(1,20,25,30)

您需要在实用程序例程库中的某处定义函数l

def l(*args):
    pairs = args[:]
    res = []
    while len(pairs) > 1:
        res += range(pairs[0], pairs[1]+1)
        pairs = pairs[2:]
    assert len(pairs) == 0
    return res
  • 断言是为了确保你输入偶数个参数。
  • argspairs的副本是为了确保您不会意外修改传递给l的变量,如

    mypairs = [1,20,25,30]
    print(l(*mypairs))