Python 查找列表中列表之间减法的最大绝对值
我有这样一份清单:Python 查找列表中列表之间减法的最大绝对值,python,list,numpy,Python,List,Numpy,我有这样一份清单: l = [[8,7,6], [9,9,9], [4,5,9], [1,5,1]] 我想找出两个连续列表中元素减法的最大值。 例如: 在[9,9,9]和[8,7,6]>1,2,3]>3的最大值之间 在[4,5,9]和[9,9,9]->5,4,0]->5的最大值之间 在[1,5,1]和[4,5,9]->最大值[3,0,8]->8之间 然后我想要一个带有[3,5,8]的列表 由于我认为代码必须与numpy的1.6.1版兼容,因此我采用以下方式: new_l = [] for in
l = [[8,7,6], [9,9,9], [4,5,9], [1,5,1]]
我想找出两个连续列表中元素减法的最大值。
例如:
在[9,9,9]和[8,7,6]>1,2,3]>3的最大值之间
在[4,5,9]和[9,9,9]->5,4,0]->5的最大值之间
在[1,5,1]和[4,5,9]->最大值[3,0,8]->8之间
然后我想要一个带有[3,5,8]的列表
由于我认为代码必须与numpy的1.6.1版兼容,因此我采用以下方式:
new_l = []
for index, i in enumerate(l):
if index < len(l)-1:
t = []
for jndex, j in enumerate(i):
t.append(l[index +1][jndex] - l[index][jndex])
new_l.append(max([abs(number) for number in t]))
new_l = new_l[:-1]
有更好的办法吗?提前感谢使用常规Python,您可以将列表理解与zip一起使用两次:
对于常规Python,您可以将列表理解与zip一起使用两次:
以下嵌套理解将起作用:
l = [[8,7,6], [9,9,9], [4,5,9], [1,5,1]]
[max(map(abs, (x-y for x, y in zip(a, b)))) for a, b in zip(l, l[1:])]
# [3, 5, 8]
zipl,l[1:]生成成对的相邻列表,然后再次压缩以检索成对差异。以下嵌套理解将起作用:
l = [[8,7,6], [9,9,9], [4,5,9], [1,5,1]]
[max(map(abs, (x-y for x, y in zip(a, b)))) for a, b in zip(l, l[1:])]
# [3, 5, 8]
zipl,l[1:]生成相邻列表对,然后再次压缩以检索成对差异。根据,这是标准的NumPy解决方案:
res = np.abs(np.diff(L, axis=0)).max(1)
对于大型阵列,通过numba,您可能会看到显著的性能改进。这两个版本都比非矢量化Python列表理解更有效
from numba import njit
L = np.array([[8,7,6], [9,9,9], [4,5,9], [1,5,1]] * 10**6)
@njit
def differ(A):
res = np.zeros(A.shape[0]-1)
for i in range(A.shape[0]-1):
for j in range(A.shape[1]):
res[i] = max(res[i], abs(A[i+1, j] - A[i, j]))
return res
assert np.array_equal(np.abs(np.diff(L, axis=0)).max(1), differ(L))
%timeit np.abs(np.diff(L, axis=0)).max(1) # 161 ms per loop
%timeit differ(L) # 53.7 ms per loop
%timeit [max(abs(i-j) for i, j in zip(*v)) for v in zip(L, L[1:])] # 22.5 s per loop
根据,这是标准的NumPy解决方案:
res = np.abs(np.diff(L, axis=0)).max(1)
对于大型阵列,通过numba,您可能会看到显著的性能改进。这两个版本都比非矢量化Python列表理解更有效
from numba import njit
L = np.array([[8,7,6], [9,9,9], [4,5,9], [1,5,1]] * 10**6)
@njit
def differ(A):
res = np.zeros(A.shape[0]-1)
for i in range(A.shape[0]-1):
for j in range(A.shape[1]):
res[i] = max(res[i], abs(A[i+1, j] - A[i, j]))
return res
assert np.array_equal(np.abs(np.diff(L, axis=0)).max(1), differ(L))
%timeit np.abs(np.diff(L, axis=0)).max(1) # 161 ms per loop
%timeit differ(L) # 53.7 ms per loop
%timeit [max(abs(i-j) for i, j in zip(*v)) for v in zip(L, L[1:])] # 22.5 s per loop
如果要使用NumPy:np.absnp.diffl,axis=0.max1。如果要使用NumPy:np.absnp.diffl,axis=0.max1。