0

我尝试将m向量样本(带有整数条目)与m评估一起构建。如果其条目之一是 number ,则x对 shape向量(n,1)进行评估。否则,它被评估为。 为了处理许多这样的向量和评估,样本向量存储在一个形状中,而评估存储在一个形状中。见代码:y=12y=0
(n,m)ndarray(1,m)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)

一些执行表明这比我的第一种方法要慢一些。(实际上,这个分析器首先说这numpy.apply_along_axis不是为了速度。我也不知道lambda在这种情况下有多好。)

有没有办法对 的计算进行矢量化,即根据该列是否包含元素Y来分配一个值1或给每一列?02

4

1 回答 1

1

当使用 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 微秒内执行。

于 2021-11-25T13:31:09.527 回答