Python / NumPy:从两个列表中返回一个较小(LHS)+较大元素(RHS)的列表

时间:2015-03-26 09:34:20

标签: python python-2.7 numpy

总而言之,我想做一些简单的事情,即比较AB然后返回左侧列(第0列)中的较小元素和右侧较大的元素专栏(第1栏)。

说,

import numpy as np
A = np.array([[  311.,360.],
             [-4022.,-3973.],
             [   96.,145.],
             [ 3989.,4038.]])

B = np.array([[310.,460.],
             [ -4018.,4013.],
             [ -297.,-256.],
             [ 4005.,4039.]])

我想得到: -

C = [[  310.,460.],
     [-4022.,4013.],
     [  -297.,145.],
     [ 3989.,4039.]]

我尝试A[A>B],但元素的位置不合适。有没有一种简单的方法来解决这个问题?感谢您的关注和亲切的帮助!

3 个答案:

答案 0 :(得分:4)

使用A[A>B],您会获得A的所有元素的列表,这些元素大于B的相应元素。 改为使用

>>> idx1 = A[:,0]<B[:,0]
>>> idx2 = A[:,1]>B[:,1]
>>> idx = np.column_stack((idx1,idx2))
>>> np.where(idx,A,B)
array([[  310.,   460.],
       [-4022.,  4013.],
       [ -297.,   145.],
       [ 3989.,  4039.]])

答案 1 :(得分:0)

也许有一种更简单的方法可以做到这一点,但这很好用:

import numpy as np
A = np.array([[  311.,360.],
             [-4022.,-3973.],
             [   96.,145.],
             [ 3989.,4038.]])

B = np.array([[310.,460.],
             [ -4018.,4013.],
             [ -297.,-256.],
             [ 4005.,4039.]])
#join the desired columns
firstcol = np.vstack((A[:,0], B[:,0]))
secondcol = np.vstack((A[:,1], B[:,1]))

#find the min and max values
mincol =  np.amin(firstcol, axis=0)
maxcol = np.amax(secondcol, axis=0)

C = np.vstack((mincol, maxcol))
print C.T
[[  310.   460.]
 [-4022.  4013.]
 [ -297.   145.]
 [ 3989.  4039.]]

答案 2 :(得分:0)

从@ plonser的答案扩展而来,我实施的单行解决方案是:

C = np.array([np.where(A<B,A,B)[:,0],
              np.where(A>B,A,B)[:,1]]).T

谢谢大家的帮忙!