Как векторизовать вычисление среднего значения для определенного набора индексов, заданных в виде строк матрицы?

Вы можете передать обратный вызов и вызвать обратный вызов внутри асинхронного вызова

примерно так:

class func getGenres(completionHandler: (genres: NSArray) -> ()) {
    ...
    let task = session.dataTaskWithURL(url) {
        data, response, error in
        ...
        resultsArray = results
        completionHandler(genres: resultsArray)
    }
    ...
    task.resume()
}

, а затем вызвать этот метод:

override func viewDidLoad() {
    Bookshop.getGenres {
        genres in
        println("View Controller: \(genres)")     
    }
}
1
задан RunOrVeith 16 January 2019 в 15:23
поделиться

1 ответ

Мы можем использовать matrix-multiplication -

c = A.sum(1,keepdims=True)
means_np = np.where(c==0,0,A.dot(X)/c)

Мы можем оптимизировать его дальше, преобразовав A в float32 dtype, если это еще не так, и если потеря точности в порядке, как показано ниже -

In [57]: np.random.seed(0)

In [58]: A = np.random.randint(0,2,(1000,1000))

In [59]: X = np.random.rand(1000,1000).astype(np.float32)

In [60]: %timeit A.dot(X)
10 loops, best of 3: 27 ms per loop

In [61]: %timeit A.astype(np.float32).dot(X)
100 loops, best of 3: 10.2 ms per loop

In [62]: np.allclose(A.dot(X), A.astype(np.float32).dot(X))
Out[62]: True

Таким образом, используйте A.astype(np.float32).dot(X) для замены A.dot(X).

В качестве альтернативы, чтобы решить для случая, когда сумма строк равна zero, и это требует от нас использования np.where, мы могли бы присвоить любое ненулевое значение, скажем, 1 в c, а затем просто делим на это, например, -

c = A.sum(1,keepdims=True)
c[c==0] = 1
means_np = A.dot(X)/c

Это также позволило бы избежать предупреждения, которое в противном случае мы получили бы из np.where в тех случаях с нулевой суммой.

0
ответ дан Divakar 16 January 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: