我正在解决一个琐碎的问题。我可以通过迭代来解决它,但是它太慢了。
我的问题:
import android.os.Bundle;
import android.database.Cursor;
简单地说,我需要将arr3 [:] [:]中格式为[R,G,B])的每个元素与arr2中的相应元素相乘,这些元素都处于float(距离)且都没有迭代>
谢谢
答案 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的建议相同,None
和np.newaxis
做相同的事情。)
这会将较小数组的形状更改为(4,4,1)
,并将其沿较大数组的最后一个轴沿每个条目应用。