在 matlab 中,我们可以使用[1:20,25:30]
编写1到30之间的列表,不包括21-24。
在python中最有效的方法是什么?
另一个问题是,是否有一种有效的方法可以删除列表中的一个元素或python中 ndarray 中的列?与 matlab 中的相同,只需设置A[:,1]=[]
?
答案 0 :(得分:2)
在MATLAB / Octave中
[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
使用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
args
到pairs
的副本是为了确保您不会意外修改传递给l
的变量,如
mypairs = [1,20,25,30]
print(l(*mypairs))