我在对numpy数组进行乘法时遇到了以下问题。在下面的示例中(稍微简化了一下我正在处理的真实版本),我从一个几乎为空的数组A和一个完整的数组C开始。然后我使用递归算法填充A。
下面,我用两种不同的方法执行此算法。第一种方法涉及以下操作:
第二种方法涉及使用for循环。
请注意,数组A和B是相同的,但是它们是使用两种不同的方法填充的。 在下面的示例中,我计算了使用每种方法执行计算所需的时间。 我发现,例如,当n_pix=2和max_counts=400时,第一种方法比第二种方法快得多(也就是说,time_np比time_for小得多)。 然而,当我切换到例如n_pix=1000和max_counts=400时,我发现方法2要快得多(time_for比time_np小得多)。 我原以为方法1总是会更快,因为方法2明确地运行循环,而方法1使用np.multiply。
因此,我有两个问题:
1. 对于固定的max_counts,为什么时间随着n_pix的变化而表现出这种方式? 2. 写这段代码的最佳方法是什么,以便它在所有n_pix上都快速运行?
也就是说,有人能否建议第3种方法? 在我的项目中,这段代码对于大型和小型的n_pix范围内的快速运行非常重要。
下面,我用两种不同的方法执行此算法。第一种方法涉及以下操作:
n_array = np.arange(0,c-1)
temp_vec= C[c-n_array] * A[n_array]
A[c] += temp_vec.sum(axis=0)
第二种方法涉及使用for循环。
for m in range(0, c - 1):
B[c] += C[c-m] * B[m]
请注意,数组A和B是相同的,但是它们是使用两种不同的方法填充的。 在下面的示例中,我计算了使用每种方法执行计算所需的时间。 我发现,例如,当n_pix=2和max_counts=400时,第一种方法比第二种方法快得多(也就是说,time_np比time_for小得多)。 然而,当我切换到例如n_pix=1000和max_counts=400时,我发现方法2要快得多(time_for比time_np小得多)。 我原以为方法1总是会更快,因为方法2明确地运行循环,而方法1使用np.multiply。
因此,我有两个问题:
1. 对于固定的max_counts,为什么时间随着n_pix的变化而表现出这种方式? 2. 写这段代码的最佳方法是什么,以便它在所有n_pix上都快速运行?
也就是说,有人能否建议第3种方法? 在我的项目中,这段代码对于大型和小型的n_pix范围内的快速运行非常重要。
import numpy as np
import time
def return_timing(n_pix,max_counts):
A=np.zeros((max_counts+1,n_pix))
A[0]=np.random.random(n_pix)*1.8
A[1]=np.random.random(n_pix)*2.3
B=np.zeros((max_counts+1,n_pix))
B[0]=A[0]
B[1]=A[1]
C=np.outer(np.random.random(max_counts+1),np.random.random(n_pix))*3.24
time_np=0
time_for=0
for c in range(2, max_counts + 1):
t0 = time.time()
n_array = np.arange(0,c-1)
temp_vec= C[c-n_array] * A[n_array]
A[c] += temp_vec.sum(axis=0)
time_np += time.time()-t0
t0 = time.time()
for m in range(0, c - 1):
B[c] += C[c-m] * B[m]
time_for += time.time()-t0
return time_np, time_for