Arrayfire python行加法和乘法



我正试图通过翻译一些矢量化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的答案,你可以做到这一点,直到添加为一个功能请求。

>>> 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操作,因此它不会分配任何额外的内存。算术运算和平铺运算将合并成一个高效的单启动内核。

相关内容

  • 没有找到相关文章

最新更新