gpt4 book ai didi

python - 避免列切片数组进行计算

转载 作者:行者123 更新时间:2023-11-28 22:27:27 25 4
gpt4 key购买 nike

import numpy as np
Xs = np.array([[1,3,3,4,5,7], [2,4,5,1,1,6], [5,5,6,4,3,2]]).T
groupIDs = np.array([10,10,20,20,30,30])
p = np.array([0.5, 0.5, 0.25, 0.75, 1, 0])
_,idx,tags = np.unique(groupIDs, return_index=1, return_inverse=1)
print(Xs)
[[1 2 5]
[3 4 5]
[3 5 6]
[4 1 4]
[5 1 3]
[7 6 2]]

我正在尝试创建一个新表,其中包含每组 pX 之间的乘积总和,每列。我能想到的使这项工作的唯一方法是

new = np.empty((6,3))
for i in range(3):
new[:,i] = np.add.reduceat((p * Xs[:,i]),idx)[tags]
print(new)
[[ 2. 3. 5. ]
[ 2. 3. 5. ]
[ 3.75 2. 4.5 ]
[ 3.75 2. 4.5 ]
[ 5. 1. 3. ]
[ 5. 1. 3. ]]

我正在努力调整自己的思维方式,以“向量方式”思考,以通过避免循环使其(希望)更快地处理由数千个 xs 组成的大型数据集。请有任何建议。

最佳答案

import numpy as np
Xs = np.array([[1,3,3,4,5,7], [2,4,5,1,1,6], [5,5,6,4,3,2]])
groupIDs = np.array([10,10,20,20,30,30])
p = np.array([0.5, 0.5, 0.25, 0.75, 1, 0])
_,idx,tags = np.unique(groupIDs, return_index=1, return_inverse=1)

print np.add.reduceat((p*Xs).T, idx)[tags]

无需使用for。转置一些矩阵就足够了,检查最后一行。

我删除了 Xs 声明中的转置。但是如果你真的需要它,你必须在最后一行添加一个 ((p*Xs.T).T)

关于python - 避免列切片数组进行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44050573/

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