6

有没有办法np.newaxis与 Numba一起使用nopython?为了应用广播功能而不回退python?

例如

@jit(nopython=True)
def toto():
    a = np.random.randn(20, 10)
    b = np.random.randn(20) 
    c = np.random.randn(10)
    d = a - b[:, np.newaxis] * c[np.newaxis, :]
    return d

谢谢

4

3 回答 3

7

您可以使用 reshape 来完成此操作,目前似乎[:, None]不支持索引。请注意,这可能不会比使用 python 快多少,因为它已经被矢量化了。

@jit(nopython=True)
def toto():
    a = np.random.randn(20, 10)
    b = np.random.randn(20) 
    c = np.random.randn(10)
    d = a - b.reshape((-1, 1)) * c.reshape((1,-1))
    return d
于 2016-08-04T11:44:43.723 回答
7

在我的情况下(numba:0.35,numpy:1.14.0)expand_dims工作正常:

import numpy as np
from numba import jit

@jit(nopython=True)
def toto():
    a = np.random.randn(20, 10)
    b = np.random.randn(20) 
    c = np.random.randn(10)
    d = a - np.expand_dims(b, -1) * np.expand_dims(c, 0)
    return d

当然,我们可以expand_dims使用广播省略第二个。

于 2019-05-10T12:48:58.923 回答
1

这可以使用最新版本的 Numba (0.27) 和 numpy 来完成stride_tricks。你需要小心这个,它有点难看。阅读文档字符串as_strided确保您了解发生了什么,因为这不是“安全的”,因为它不检查形状或步幅。

import numpy as np
import numba as nb

a = np.random.randn(20, 10)
b = np.random.randn(20) 
c = np.random.randn(10)

def toto(a, b, c):

    d = a - b[:, np.newaxis] * c[np.newaxis, :]
    return d

@nb.jit(nopython=True)
def toto2(a, b, c):
    _b = np.lib.stride_tricks.as_strided(b, shape=(b.shape[0], 1), strides=(b.strides[0], 0))
    _c = np.lib.stride_tricks.as_strided(c, shape=(1, c.shape[0]), strides=(0, c.strides[0]))
    d = a - _b * _c

    return d

x = toto(a,b,c)
y = toto2(a,b,c)
print np.allclose(x, y) # True
于 2016-08-05T16:36:04.257 回答