Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找列表中列表之间减法的最大绝对值_Python_List_Numpy - Fatal编程技术网

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。