Вы можете передать обратный вызов и вызвать обратный вызов внутри асинхронного вызова
примерно так:
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)")
}
}
Мы можем использовать 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
в тех случаях с нулевой суммой.