Python 以numpy为单位按列最大值减少

Python 以numpy为单位按列最大值减少,python,numpy,Python,Numpy,假设我有以下数组: b = np.array([[1,2],[3,4],[5,6],[3,3]]) 我希望通过获取元素对并丢弃值和较低的元素,将其长度减半。在无需求和的一维中,这很容易: a = np.array([1,2,3,4]) a.reshape((-1,2)).max(axis=1) 并生成所需的结果:[2,4] 我的问题是,是否有可能在两个维度上进行等价操作,从而使b上的操作产生[[3,4],[5,6]] 作为参考,以下是一种非numpy方式: b = [[1,2],[3,4],

假设我有以下数组:

b = np.array([[1,2],[3,4],[5,6],[3,3]])
我希望通过获取元素对并丢弃值和较低的元素,将其长度减半。在无需求和的一维中,这很容易:

a = np.array([1,2,3,4])
a.reshape((-1,2)).max(axis=1)
并生成所需的结果:
[2,4]

我的问题是,是否有可能在两个维度上进行等价操作,从而使
b
上的操作产生
[[3,4],[5,6]]

作为参考,以下是一种非numpy方式:

b = [[1,2],[3,4],[5,6],[3,3]]
c = []
for i in range(0,len(b) - 1,2):
    if sum(b[i]) > sum(b[i+1]):
        c += [b[i]]
    else:
        c += [b[i+1]]
print(c)

下面是一种使用拼接的方法,
zip()
map()

解释

  • b[::2]
    获取
    b
    中从索引0开始的所有其他元素
  • b[1::2]
    获取
    b
    中从索引1开始的所有其他元素
  • zip(b[::2],b[1::2])
    b
    创建成对元组列表
  • map(lambda x:x[0]if sum(x[0])>sum(x[1])else x[1])
    返回每个具有最高和的元组中的元素
如果希望输出为示例中所示的列表的
列表
,只需使用
list()
构造函数包装
map()
步骤的输出:

map(
    lambda x: list(x[0]) if sum(x[0]) > sum(x[1]) else list(x[1]),
    zip(b[::2], b[1::2])
)
#[[3, 4], [5, 6]]

下面是一种使用拼接的方法,
zip()
map()

解释

  • b[::2]
    获取
    b
    中从索引0开始的所有其他元素
  • b[1::2]
    获取
    b
    中从索引1开始的所有其他元素
  • zip(b[::2],b[1::2])
    b
    创建成对元组列表
  • map(lambda x:x[0]if sum(x[0])>sum(x[1])else x[1])
    返回每个具有最高和的元组中的元素
如果希望输出为示例中所示的列表的
列表
,只需使用
list()
构造函数包装
map()
步骤的输出:

map(
    lambda x: list(x[0]) if sum(x[0]) > sum(x[1]) else list(x[1]),
    zip(b[::2], b[1::2])
)
#[[3, 4], [5, 6]]

您可以计算总和,取
argmax
并将其应用于原始对:

# form pairs of pairs
>>> b2 = b.reshape(*b.shape[:-2], -1, 2, b.shape[-1])
# sum and take the argmax for each pair of sums
>>> idx = np.argmax(b2.sum(axis=-1), axis=-1)
# use the argmax to select the relevant pairs
>>> c = b2[np.arange(b2.shape[0]), idx]
# admire
>>> c
array([[3, 4],
       [5, 6]])

您可以计算总和,取
argmax
并将其应用于原始对:

# form pairs of pairs
>>> b2 = b.reshape(*b.shape[:-2], -1, 2, b.shape[-1])
# sum and take the argmax for each pair of sums
>>> idx = np.argmax(b2.sum(axis=-1), axis=-1)
# use the argmax to select the relevant pairs
>>> c = b2[np.arange(b2.shape[0]), idx]
# admire
>>> c
array([[3, 4],
       [5, 6]])
#佩服
确实
#佩服
确实