我尝试构建m向量的示例(带有整数项)以及m计算。如果向量x的形状(n,1)是数字2,则其求值为y=1。否则,它将被计算为y=0。
为了处理许多这样的向量和评估,样本向量存储在(n,m)-shaped ndarray中,而评估存储在(1,m)-shaped ndarray中。见守则:
import numpy as np
n = 10 # number of entries in each sample vector
m = 1000 # number of samples
X = np.random.randint(-10, 10, (n, m))
Y = []
for i in range(m):
if 2 in X[:, i]:
Y.append(1)
else:
Y.append(0)
Y = np.array(Y).reshape((1,-1))
assert (Y.shape == (1,m))如何将Y的计算向量化?我试图用以下方法替换X和Y的初始化/计算:
X = np.random.randint(-10,10,(n,m))
Y = np.apply_along_axis(func1d=lambda x: 1 if 2 in x else 0, axis=0, arr=X)一些执行表明,这是大多数情况下,甚至比我的第一种方法慢一点。(实际上,this从句开头是说numpy.apply_along_axis不是为了速度。另外,我不知道lambda在这种情况下有多好。)
是否有一种方法将Y的计算向量化,即根据该列是否包含元素2,将值1或0分配给每一列
发布于 2021-11-25 13:31:09
当使用Numpy数组和逻辑语句时,它进行了许多优化,而无需用户手动将任务向量化。以下代码达到相同的解决方案:
# assign logical 1 where element == 2 everywhere in the array X,
# then, for each column (axis = 0), if any element == 1 assign column logical 1
Y = (X == 2).any(axis = 0).reshape(1, -1)
print(Y.shape)使用timeit评估执行时间:
循环方法:每次运行3240微秒
numpy方法:每次运行6.57微秒
如果您感兴趣,您可以看到使用其他矢量化方法(如np.vectorise )是否会进一步改善时间,尽管我确信,在默认情况下,基本的Numpy优化在CPU指令级别(SIMD)执行自己的矢量化。
底线是,当使用numpy时,总是尝试使用逻辑数组和numpy函数/方法来找到解决方案,因为它们已经在编译的二进制文件中得到了很大程度的优化,而且用于操作、访问或迭代数据的任何python函数都大大降低了执行速度。
顺便说一句,要想更快地执行循环以构建一个输出列表,最常见的方法是使用列表理解:
Y = np.array([2 in X[:, i] for i in range(m)]).reshape((1, -1))它在3070微秒/圈内执行。
https://stackoverflow.com/questions/70111797
复制相似问题