gpt4 book ai didi

python - 什么是最好的 pythonic 解决方案?

转载 作者:行者123 更新时间:2023-12-04 00:54:05 25 4
gpt4 key购买 nike

X 是一个形状为 (n,m) 的数组,Y 是一个长度为 n 的列表,其值是二进制文件,对于以下代码,使用 numpy 的最佳 pythonic 替代方案是什么?

p1 = np.zeros(X.shape[1])
p0 = np.zeros(X.shape[1])
for i in range(len(X[0])):
sum_1 = np.where(Y==1,X[:,i],0).sum()
sum_0 = np.where(Y==0,X[:,i],0).sum()
p1[i] = sum_1
p0[i] = sum_0

最佳答案

这是一个更快更简单的版本:

p1 = X.T @ Y # or np.dot(X.T, Y) if on Python < 3.5
p0 = X.T @ (1 - Y)

这利用了您的 Y 数组是 0 和 1 的事实,并计算了一个快速的点积。


使用以下框架计时结果:

import numpy as np

n = 2000
m = 1000
X = np.random.random((n, m))
Y = (np.random.random((n,)) > 0.5).astype(int)

def v0():
p1 = np.zeros(X.shape[1])
p0 = np.zeros(X.shape[1])
for i in range(len(X[0])):
sum_1 = np.where(Y==1,X[:,i],0).sum()
sum_0 = np.where(Y==0,X[:,i],0).sum()
p1[i] = sum_1
p0[i] = sum_0
return p0, p1

def v1():
p1 = np.sum(X[np.where(Y==1)], axis=0)
p0 = np.sum(X[np.where(Y==0)], axis=0)
return p0, p1

def v2():
p1 = X.T @ Y # or np.dot(X.T, Y) if on Python < 3.5
p0 = X.T @ (1 - Y)
return p0, p1

p0_0, p1_0 = v0()
p0_1, p1_1 = v1()
p0_2, p1_2 = v2()
assert np.allclose(p0_0, p0_1)
assert np.allclose(p0_0, p0_2)
assert np.allclose(p1_0, p1_1)
assert np.allclose(p1_0, p1_2)
$ python3 -m timeit -s 'import test' 'test.v0()'
10 loops, best of 5: 33.5 msec per loop
$ python3 -m timeit -s 'import test' 'test.v1()'
100 loops, best of 5: 3.81 msec per loop
$ python3 -m timeit -s 'import test' 'test.v2()'
500 loops, best of 5: 794 usec per loop

对于这组尺寸,此版本比您的原始版本快 40 倍以上。

关于python - 什么是最好的 pythonic 解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64081836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com