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]
中从索引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()
步骤的输出:
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]
中从索引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()
步骤的输出:
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]])
#佩服
确实#佩服
确实