查找最大值比较每个索引的多个数组
Posted
技术标签:
【中文标题】查找最大值比较每个索引的多个数组【英文标题】:Find max value comparing multiple arrays for each index 【发布时间】:2015-01-22 21:00:04 【问题描述】:我正在尝试找到一种方法来找到最大值,比较数组中每个观察值的多个(未知数,但长度相同)数组,返回一个具有最大值的数组。
例子:
编辑:
A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2], etc......]
返回
MAX = [2.2, 5.3, 5.2]
能够检查“输入”数组的长度是否相同,但无法比较找到最大值的数组......?
【问题讨论】:
你不是说MAX = [3.3,5.3,5.2]
吗?
@Fresheyeball:不,我想比较 A[0] 与 B[0] 与 C[0].. 以及 A[1] 与 B[1] 与 C[1] 等..不是在每个数组中找到最大值,而是在数组中找到 0:length-1...
你应该将数组转发给函数查找最大数。
@DiKey:有点我做不到的事情。你能举个例子吗?
【参考方案1】:
对于数组的每个索引,创建一个包含“列”中所有元素的数组,并找到这些值的最大值。返回生成的数组。示例用法:maxValues(A)
会给出想要的结果。
function maxValues(array)
var maxArray = [];
var length = array[0].length;
for (var i = 0; i < length; i++)
var ithColumn = [].map.call(array, function(array)
return array[i];
);
maxArray.push(Math.max.apply(null, ithColumn));
return maxArray;
【讨论】:
感谢打开或关闭!请有人为正确答案投票。【参考方案2】:var data = [
[2.2, 3.3, 1.3],
[1.2, 5.3, 2.2],
[0.3, 2.2, 5.2]
];
function maxAtIndex (data)
//output
var maxArray = [];
//loop arrays passed in
for (var i = 0; i < data[0].length; i++)
var possibleValues = [];
//get value in array at index
for (var j = 0; j < data.length; j++)
possibleValues.push(data[j][i]);
//get the highest from possible values
var highest = Math.max.apply(null, possibleValues);
//store in output array
maxArray.push(highest);
return maxArray;
;
console.log(maxAtIndex(data)); //[ 2.2, 5.3, 5.2 ]
【讨论】:
感谢 jmfolds!请有人为正确答案投票【参考方案3】:你可以使用Array.reduce()
:
var A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2]];
var max = A.reduce(function(final, current)
for (var i = 0; i < final.length; ++i)
if (current[i] > final[i])
final[i] = current[i];
return final;
);
console.log(max);
内部函数将当前最大值与下一个数组元素进行比较,因此final
始终保存迄今为止遍历的所有元素的最大值。
【讨论】:
【参考方案4】:您只需几行代码即可将 Lo-Dash 的 zip 和 map 方法组合起来:
var A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2]];
// Creates an array of arrays, where the first array is all the first elements,
// the second array is all the second elements, etc.
var zipped = _.zip(A);
var maxes = _.map(zipped, function(arr)
return _.max(arr);
);
console.log(maxes);
【讨论】:
您的回答中有一个错字:因为 lodash 的 _.zip 界面已更改,您必须使用_.zip.apply(null, A)
应用它。【参考方案5】:
这是一个简短而甜蜜的版本:
var A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2]];
var maxA = A.map(a => Math.max.apply(null, a));
【讨论】:
【参考方案6】:我采用了Tom Panning's answer 并进一步简化了它:
var A = [[2.2, 3.3, 1.3], [1.2, 5.3, 2.2], [0.3, 2.2, 5.2]];
var MAX = _.zip.apply(null, A).map(_.max);
【讨论】:
以上是关于查找最大值比较每个索引的多个数组的主要内容,如果未能解决你的问题,请参考以下文章