python - 什么是最好的 Pythonic 解决方案?
问题描述
作为 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
数组是零和一并计算快速点积的事实。
使用以下框架的计时结果:
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 倍以上。
推荐阅读
- javascript - How does one create a function to call itself when a given condition is true in Mithril.js
- java - Verify SMTP server authentication via java api (Healthcheck including AUTH)
- python - how to get Wireless LAN adapter Wi-Fi IP Address in Python?
- java - 当其他字段具有特定值时需要注释字段
- html - Get HTML text with no tags around them
- unity3d - Unity 着色器:语法错误:第 70 行(在 d3d11 上)的意外标记“(”)帮助!!!着色器新手
- python - Create new column in Pandas dataframe based on latest value per ID
- r - 对数正态和伽马残差之间的关系,保险拟合
- amazon-web-services - 具有一个所需实例且没有负载均衡器的 AWS Auto-Scaling 组
- python - pandas insert multiple columns starting at index