在numpy中减少列max

时间:2018-02-06 02:30:25

标签: 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]]

作为参考,这是一种非笨拙的方式:

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)

3 个答案:

答案 0 :(得分:2)

您可以计算总和,取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]])

答案 1 :(得分:0)

以下是使用拼接zip()map()

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

<强>解释

  • b[::2]从索引0开始获取b中的所有其他元素。
  • b[1::2]从索引1开始获取b中的所有其他元素。
  • zip(b[::2], b[1::2])b创建成对元组列表。
  • map(lambda x: x[0] if sum(x[0]) > sum(x[1]) else x[1])返回每个元组中具有最高总和的元素。

如果您希望输出为示例中显示的list列表,只需使用map()构造函数包装list()步骤的输出:

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]]

答案 2 :(得分:0)

import numpy as np
b = np.array([[1, 2], [3, 4], [5, 6], [3, 3]])

ibl = len(b)

'''
Using this method you will get half max elements for even number of 
array elements and (half-1)/2 for odd number of array elements. And 
it will work for any array/subarray size
'''
while len(b) > int(ibl/2) :
    b = np.array(list([bb for bb in b if any(sum(bb) > sum(other) for other in b)]))


output: array([[3, 4],
   [5, 6]])