【问题标题】:Way to multiply each element of one array to PARTS of another?将一个数组的每个元素乘以另一个数组的部分的方法?
【发布时间】:2017-10-02 08:48:40
【问题描述】:

我是编程新手,想知道如何乘法

[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中

【问题讨论】:

  • 您正在寻找仅使用 python 或 javascript 的解决方案?

标签: javascript python arrays matrix-multiplication


【解决方案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]

【讨论】:

  • 此示例中使用的shift 是什么?
  • @Richy 作为切片“跳过”参数,我编辑了答案
  • 谢谢你们!你真棒
  • @DeepSpace 现在说得通了 :-)
【解决方案2】:

您可以通过将输入设为 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]

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))

【讨论】:

    【解决方案3】:

    在 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);

    【讨论】:

      【解决方案4】:

      你可以这样做:

      1. 遍历第一个数组,以便得到一个要相乘的数字。

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

      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);

      【讨论】:

        【解决方案5】:

        您可以在 array2 上使用 map() 并使用一个 var 为每两个元素递增 array1 的索引,然后将 array1 的当前元素与 array2 中索引为该 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)

        【讨论】:

          【解决方案6】:

          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
          

          【讨论】:

            猜你喜欢
            • 2015-08-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多