numpy-将3D数组(100,100,3)与2D数组(100,100)相乘

时间:2018-07-11 19:02:56

标签: python arrays numpy multiplication elementwise-operations

我正在解决一个琐碎的问题。我可以通过迭代来解决它,但是它太慢了。

我的问题:

import android.os.Bundle;
import android.database.Cursor;

简单地说,我需要将arr3 [:] [:]中格式为[R,G,B])的每个元素与arr2中的相应元素相乘,这些元素都处于float(距离)且都没有迭代

谢谢

2 个答案:

答案 0 :(得分:0)

此操作称为 Hadamard乘积(即两个数组的逐元素乘积)。但是,对于此操作,两个数组必须具有相同的维数。因此,您必须将2D数组提升为3D,然后可以使用简单的*numpy.einsum(),如下所示:

In [11]: arr3 = np.arange(4*4*3).reshape(4, 4, 3)
    ...: arr2 = np.arange(4*4).reshape(4, 4)

In [12]: np.einsum('ijk, ijk -> ijk', arr3, arr2[..., np.newaxis])
Out[12]: 
array([[[  0,   0,   0],
        [  3,   4,   5],
        [ 12,  14,  16],
        [ 27,  30,  33]],

       [[ 48,  52,  56],
        [ 75,  80,  85],
        [108, 114, 120],
        [147, 154, 161]],

       [[192, 200, 208],
        [243, 252, 261],
        [300, 310, 320],
        [363, 374, 385]],

       [[432, 444, 456],
        [507, 520, 533],
        [588, 602, 616],
        [675, 690, 705]]])

答案 1 :(得分:0)

您可以扩展较小数组的尺寸,以允许使用broadcasting

例如,可以使用np.newaxis

import numpy as np
arr3 = np.zeros(shape=[4, 4, 3])
arr2 = np.zeros(shape=[4, 4])

res = arr3 * arr2[..., np.newaxis])

(这与@hpaulj的建议相同,Nonenp.newaxis做相同的事情。)

这会将较小数组的形状更改为(4,4,1),并将其沿较大数组的最后一个轴沿每个条目应用。