在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])
有迹象表明,做samething等功能,但所有最终使用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
使用一个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 可以通过将更多操作移到编译代码中来更快地完成其中一些事情。但我预计,逻辑将是相似的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句