将一个数组的每个元素乘以另一个数组的部分的方法?

时间:2017-05-04 09:02:21

标签: javascript python arrays matrix-multiplication

我是编程新手,并试图找出如何乘法

[1,1,0]

[4,9,7,2,1,6]

用于下一个结果输出

[4,9,7,2,0,0]

如你所见,我想通过移入它们将[1,1,0]数组的每个值乘以第二个数组的每两个

[1..] * [4,9..] = [4,9]
[.1.] * [.7,2.] = [7,2]
[..0] * [..1,6] = [0,0]

作为js中的例子我写了类似

的内容
var firstArray = [1,1,0];
var secondArray = [4,9,7,2,1,6];
var shift = secondArray / firstArray;
var startpos = 0;
var outArray = [];

for(i=0; i< firstArray.length; i++){
    for(z=i; z< shift+i; z++){
        outArray.push(firstArray[i] * secondArray[z]);
    }
}

console.log(outArray);

可能是在python中

6 个答案:

答案 0 :(得分:1)

您可以滥用zip并列出切片:

a = [1, 1, 0]
b = [4, 9, 7, 2, 1, 6]

shift = len(b) // len(a)  # use / in Python 2
li = []
for num_a, num_b1, num_b2 in zip(a, b[::shift], b[1::shift]):
    li.extend([num_a * num_b1, num_a * num_b2])

print(li)
# [4, 9, 7, 2, 0, 0]

答案 1 :(得分:0)

在Javascript中,您可以使用

来使用更实用的方法
  • Array#reduce用于迭代因子并返回新数组,

  • Array#concat用于在乘以结果集后添加部分结果,

  • Array#slice,只获取values数组的两个元素,

  • Array#map用于将零件数组与给定因子相乘,

  • 至少使用数组作为reduce的起始值。

var factors = [1, 1, 0],
    values = [4, 9, 7, 2, 1, 6],
    result = factors.reduce(
        (r, f, i) => r.concat(
            values
                .slice(i * 2, (i + 1) * 2)
                .map(v => f * v)
        ),
        []
    );

console.log(result);

答案 2 :(得分:0)

您可以通过输入2D数组来将其表示为标准矩阵乘法。

我从这里得到了乘法算法:https://stackoverflow.com/a/27205510/5710637

现在计算如下:

[1,0,0]   [4,9]   [4,9]
[0,1,0] * [7,2] = [7,2]
[0,0,0]   [1,6]   [0,0]

&#13;
&#13;
function multiplyMatrices(m1, m2) {
    var result = [];
    for (var i = 0; i < m1.length; i++) {
        result[i] = [];
        for (var j = 0; j < m2[0].length; j++) {
            var sum = 0;
            for (var k = 0; k < m1[0].length; k++) {
                sum += m1[i][k] * m2[k][j];
            }
            result[i][j] = sum;
        }
    }
    return result;
}

var in1 = [[1, 0, 0], [0, 1, 0], [0, 0, 0]];
var in2 = [[4, 9], [7, 2], [1, 6]]

console.log(multiplyMatrices(in1, in2))
&#13;
&#13;
&#13;

答案 3 :(得分:0)

你可以这样做:

  1. 迭代第一个数组,以便得到一个乘以的数字。

  2. 然后从目标数组中提取两个元素并相乘,将结果存储在res数组中。

  3. var mul = [1,1,0];
    
    
        var target = [4,9,7,2,1,6];
        var start = 0;
        var res = [];
        mul.forEach(function(v,i) {
          var arr = target.slice(start, start+2);//from start index extract two 
                                                 //elements
          arr.forEach(function(val,i) {
            res.push(v * val);
          });
          start += 2;
        });
    
        console.log(res);

答案 4 :(得分:0)

你可以在array2上使用map()并使用一个var来为每两个元素递增array1的索引,然后将array1的当前元素与array2中的元素相乘,其中index具有var。

var a1 = [1,1,0];
var a2 = [4,9,7,2,1,6];

var j = 0;
var result = a2.map(function(e, i) {
  if(i % 2 == 0 && i != 0) j++
  return e * a1[j];
})

console.log(result)

答案 5 :(得分:0)

python中,您可以使用以下代码。我假设第二个数组的长度较大,可以被较短数组的长度整除

def multiply(a, b):
    x, y = len(a), len(b)                        # Find lengths
    assert x % y == 0                            
    n = x / y
    result = [a[i] * b[i / n] for i in range(x)] # For each index in a, calculate the appropriate element in output by multiplying with relevant part
    print result