python - 用python编写[1:20,25:30]最有效的方法是什么
问题描述
在matlab中,我们可以编写一个从 1 到 30 的列表,不包括 21-24 [1:20,25:30]
。在 python 中最有效的方法是什么?
另一个问题是,是否有一种有效的方法可以在 python 中删除列表中的一个元素或ndarray中的列?通过简单的设置与matlab中的相同A[:,1]=[]
吗?
解决方案
在 MATLAB/八度
[1:20,25:30]
发生 3 件事 -1:20
并25: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_
。 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
使用 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 可以通过将更多操作移至已编译代码来更快地完成其中一些操作。但我预计,逻辑将是相似的。
推荐阅读
- javascript - 两个数组的水平串联
- javascript - 将数据发送到另一个页面 - html
- svn - 用于避免提交大于 100MB 的预提交脚本
- c++ - 通过this指针访问时的成员与自身的成员指针的区别(简单QT示例问题)
- sql-server - SSIS sysssislog 表 - Starttime 或 EndTime 是否记录为 UTC?
- android - RecyclerView 不会显示图像但显示文本
- linux - 如何正确读取带有 sh 脚本的文件并在 if 语句中使用它?
- javascript - 如何在没有事件的情况下调用 ember octane 模板中的函数?
- python - PyQT5 的输入应用程序对话框没有停留在 windows 10 屏幕上
- appium-android - 使用给定的搜索参数(Appium 1.13.0)无法在页面上找到元素