首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vectorize“in”

Vectorize“in”
EN

Stack Overflow用户
提问于 2021-11-25 13:15:53
回答 1查看 78关注 0票数 0

我尝试构建m向量的示例(带有整数项)以及m计算。如果向量x的形状(n,1)是数字2,则其求值为y=1。否则,它将被计算为y=0

为了处理许多这样的向量和评估,样本向量存储在(n,m)-shaped ndarray中,而评估存储在(1,m)-shaped ndarray中。见守则:

代码语言:javascript
复制
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的计算向量化?我试图用以下方法替换XY的初始化/计算:

代码语言:javascript
复制
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,将值10分配给每一列

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-25 13:31:09

当使用Numpy数组和逻辑语句时,它进行了许多优化,而无需用户手动将任务向量化。以下代码达到相同的解决方案:

代码语言:javascript
复制
# 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函数都大大降低了执行速度。

顺便说一句,要想更快地执行循环以构建一个输出列表,最常见的方法是使用列表理解:

代码语言:javascript
复制
Y = np.array([2 in X[:, i] for i in range(m)]).reshape((1, -1))

它在3070微秒/圈内执行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70111797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档