python - 最大化二维数组的第n行总和所需的最小交换?
问题描述
我正在尝试不同的数组大小和元素。为简单起见,我采用了一个大小为 3x3 的数组。以二维列表的形式如下:
input_matrix = [[80,81,84],[69,80,51],[13,37,65]]
那么,什么可能是最好的方法呢?如果我使用嵌套循环,那么对于我想要避免的具有 O(n^2) 复杂性的简单任务来说,这将是一种过度杀伤力。
编辑1:
通过求和最大化,我的意思是我可以交换数组中的元素,并且对于第一行中的每个排列,都会有不同的总和。那么我需要多少次交换才能获得这样的安排
解决方案
如果您只能跨列交换:
通过行最大化,我假设您的意思是您可以在数组中垂直交换以使行最大化。在这种情况下,它可以通过 numpy 完成,如下所示:
(np.argmax(np.array(input_matrix), axis = 0)!=r).sum()
这里的技巧是找到每列的最大元素,然后如果它不在所需的行(即 r)中,则将其视为交换,因为那是您需要交换和求和的地方。
如果您可以交换数组中的任何元素:
如果您可以从整个数组中获取值,则需要一个更复杂的机制,如下所示:
def largest_indices(ary, n):
"""Returns the n largest indices from a numpy array."""
flat = ary.flatten()
indices = np.argpartition(flat, -n)[-n:]
indices = indices[np.argsort(-flat[indices])]
return np.unravel_index(indices, ary.shape)
(largest_indices(np.array(input_matrix), len(input_matrix[0]))[0]!=r).sum()
它继续在n
数组中查找最大元素,找到它们的索引,如果它们不在所需的行中,它将它们计为交换并返回交换总数。功劳归于这个答案。
推荐阅读
- c++ - 为什么 GCC 在这里优化分配?
- python - Jupyter,ipywidgets,如何使用下拉菜单刷新绘图
- python - 多级引号包裹 csv 文件 pandas
- android - 如何在android studio中设置默认数字和默认文本以在其中发送消息?
- r - 如何根据函数参数转换 r data.table 对象
- jquery - 动态引导表导出到 json(带输入/选择)
- c# - 表单应用程序 - 如何在 C# 中创建一个生成随机时间的表单
- package - 自定义元素和自定义属性上的 Aurelia 代码共享
- python - ValueError:无法将字符串转换为浮点数:b'user1'
- python - Converting pixel values from a (x, y, colour/ coordinate colour) format to a 32-bit image