我想優化下面的代碼,可能通過在Cython中重寫它:它只需要一個低維但相對較長的numpy數組,查看其值爲0的列,並將它們標記爲-1。代碼是:優化索引和檢索Python中numpy數組中的元素?
import numpy as np
def get_data():
data = np.array([[1,5,1]] * 5000 + [[1,0,5]] * 5000 + [[0,0,0]] * 5000)
return data
def get_cols(K):
cols = np.array([2] * K)
return cols
def test_nonzero(data):
K = len(data)
result = np.array([1] * K)
# Index into columns of data
cols = get_cols(K)
# Mark zero points with -1
idx = np.nonzero(data[np.arange(K), cols] == 0)[0]
result[idx] = -1
import time
t_start = time.time()
data = get_data()
for n in range(5000):
test_nonzero(data)
t_end = time.time()
print (t_end - t_start)
data
是數據。 cols
是查找非零值的數據列數組(爲簡單起見,我將它全部放在同一列中)。我們的目標是計算一個numpy數組,result
,其中感興趣列非零的每行的值爲1,並且感興趣的相應列的值爲零的行的值爲-1。
在15,000行3列不太大的數組上運行5000次大約需要20秒。有沒有辦法可以加快速度?看起來大部分工作都是尋找非零元素並用索引檢索它們(調用nonzero
並隨後使用它的索引)。這可以優化嗎?或者這是最好的可以完成的嗎? Cython實現如何在這方面獲得更快的速度?
非零是一個很好的嘗試(不知道它是否幫助很大或所有雖然)。如果你絕望並知道cols是有效的,你可以嘗試製作一個線性索引。如果K在循環中不變,則不能每次都重做np.arange ... – seberg