我正试图通过翻译一些矢量化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操作,因此它不会分配任何额外的内存。算术运算和平铺运算将合并成一个高效的单启动内核。