Arrayfire python 行加法和乘法

Arrayfire python rowwise addition and multiplication

我正在尝试通过翻译一些矢量化的 numpy 代码来学习 Arrayfire 习语。

例如,这是numpy中有效的行加法和乘法,

>>> a = np.array([1,2,3])
>>> a
array([1, 2, 3])
>>> b = np.arange(9).reshape((3, 3))
>>> b
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> a + b
array([[ 1,  3,  5],
       [ 4,  6,  8],
       [ 7,  9, 11]])
>>> a * b
array([[ 0,  2,  6],
       [ 3,  8, 15],
       [ 6, 14, 24]])

arrayfire 中的所有数组都必须是相同的形状吗?这会产生错误。

>>> a = af.from_ndarray(a)
>>> b = af.from_ndarray(b)
>>> a + b
Invalid dimension for argument 1
Expected: ldims == rdims
>>> a * b
Invalid dimension for argument 1
Expected: ldims == rdims

根据@pradeep 的回答,您可以使用 tile 执行此操作,直到添加为功能请求。

>>> a = np.array([1,2,3])
>>> a = af.tile(af.transpose(af.from_ndarray(a)),3,1)
>>> af.display(a)

[3 3 1 1]
         1          2          3 
         1          2          3 
         1          2          3 

>>> b = np.arange(9).reshape((3, 3))
>>> b = af.from_ndarray(b)
>>> af.display(a + b)

[3 3 1 1]
         1          3          5 
         4          6          8 
         7          9         11 

>>> af.display(a * b)

[3 3 1 1]
         0          2          6 
         3          8         15 
         6         14         24 

在撰写此回复时,是的,这是正确的。阵列需要具有相同的形状。但我想指出的是,我们已经在研究二进制操作的广播功能 - 这里是 PR - 我们将尽快将此功能发布到版本中。

但是,即使是当前版本,也可以使用 tile 函数轻松解决此限制。由于 tile 将是此类广播操作的 JIT 操作,因此它不会分配任何额外的内存。算术运算和平铺运算将组合成一个高效的单启动内核。