想象一下,我有以下数组:
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)
答案 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]])