首页 > 解决方案 > 用python编写[1:20,25:30]最有效的方法是什么

问题描述

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

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

标签: pythonpython-3.xmatlabnumpy

解决方案


在 MATLAB/八度

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

还有其他功能可以做同样的事情,但最终都使用concatenate, np.block,np.hstack等是沿一个或另一个维度连接数组的基本功能np.r_concatenatenumpy


在 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使用 a 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 可以通过将更多操作移至已编译代码来更快地完成其中一些操作。但我预计,逻辑将是相似的。


推荐阅读