gpt4 book ai didi

python - 用 pandas 计算列的 "energy"

转载 作者:太空宇宙 更新时间:2023-11-03 13:11:35 29 4
gpt4 key购买 nike

我尝试计算我的 pandas.DataFrame 之后的信号能量 formula for discrete-time signal .我试过 applyapplymap,也有 reduce,如这里所建议的:How do I columnwise reduce a pandas dataframe? .但我尝试的所有结果都是针对每个元素而不是整列进行操作。

这不是一个特定于信号处理的问题,它只是一个示例,说明如何将“汇总”(我不知道这个的正确术语)应用到列。

我的解决方法是获取原始 numpy.array 数据并进行计算。但我很确定有一种 pandatic 方法可以做到这一点(当然还有一种更 numpyic 的方法)。

import pandas as pd
import numpy as np

d = np.array([[2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
[0, -1, 2, -3, 4, -5, 6, -7, 8, -9],
[0, 1, -2, 3, -4, 5, -6, 7, -8, 9]]).transpose()
df = pd.DataFrame(d)

energies = []

# a same as d
a = df.as_matrix()
assert(np.array_equal(a, d))

for column in range(a.shape[1]):
energies.append(sum(a[:,column] ** 2))

print(energies) # [40, 285, 285]

提前致谢!

最佳答案

您可以对数据帧输出执行以下操作 -

(df**2).sum(axis=0) # Or (df**2).sum(0)

为了提高性能,我们可以使用从数据框中提取的数组 -

(df.values**2).sum(axis=0) # Or (df.values**2).sum(0)

为了进一步提升性能,有 np.einsum -

a = df.values
out = np.einsum('ij,ij->j',a,a)

运行时测试-

In [31]: df = pd.DataFrame(np.random.randint(0,9,(1000,30)))

In [32]: %timeit (df**2).sum(0)
1000 loops, best of 3: 518 µs per loop

In [33]: %timeit (df.values**2).sum(0)
10000 loops, best of 3: 40.2 µs per loop

In [34]: def einsum_based(a):
...: a = df.values
...: return np.einsum('ij,ij->j',a,a)
...:

In [35]: %timeit einsum_based(a)
10000 loops, best of 3: 32.2 µs per loop

关于python - 用 pandas 计算列的 "energy",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42419003/

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