【问题标题】:Going through a numpy array with order and mean calculations without a for loop在没有 for 循环的情况下通过具有顺序和均值计算的 numpy 数组
【发布时间】:2021-04-17 00:20:32
【问题描述】:

我试图把这个 for 循环变成一个 numpy 函数。 y_mean 函数从list_ 一次检查numbers 变量中声明的数字量,然后打印出它的平均值,因此它计算457.334015,424.440002 的平均值,然后计算424.440002,394.795990 的平均值等等直到它到达list 的末尾。对于xy_mean,y 将乘以 x 的位置顺序。因此,由于前 2 个数字是 457.334015,424.440002,因此计算结果将是 (1 * 457.334015+ 2 * 424.440002)/number),第二个和第三个数字将是 (2* 424.440002+ 3* 394.795990)/number。如果不使用 for 循环,如何将这两个函数转换为 numpy 形式。

原版形式:

list_ = [457.334015,424.440002,394.795990,408.903992,398.821014,402.152008,435.790985,423.204987,411.574005,
404.424988,399.519989,377.181000,375.467010,386.944000,383.614990,375.071991,359.511993,328.865997,
320.510010,330.079010,336.187012,352.940002,365.026001,361.562012,362.299011,378.549011,390.414001,
400.869995,394.773010,382.556000]

number = 2
for i in range(len(list_)-number):
    y_mean = sum(list_[i:i+number])/number
    xy_mean = sum([x * (i + 1) for i, x in enumerate(PC_list[i:i+number])])/number

Numpy 形式:

list_= np.array([457.334015,424.440002,394.795990,408.903992,398.821014,402.152008,435.790985,423.204987,411.574005,
404.424988,399.519989,377.181000,375.467010,386.944000,383.614990,375.071991,359.511993,328.865997,
320.510010,330.079010,336.187012,352.940002,365.026001,361.562012,362.299011,378.549011,390.414001,
400.869995,394.773010,382.556000])

number = 2
y_mean = list_.mean()

【问题讨论】:

  • 这里的PC_list 是什么?
  • 这段代码根本不清楚,你在循环计算y_mean,你在哪里使用它?每次重新计算时,y_mean 的先前值都会被覆盖。那你为什么要计算所有这些? xy_mean 也是如此,您的意思是计算它们并将它们附加到列表中吗?

标签: python numpy linear-regression mean numpy-ndarray


【解决方案1】:

假设 OP 打算将值附加到列表中,并且 PC_list 只是另一个与 list_ 大小相同的列表,则可以使用 np.convolve 完成此操作

import numpy as np

list_ = np.array([457.334015,424.440002,394.795990,408.903992,398.821014,402.152008,435.790985,423.204987,411.574005,
404.424988,399.519989,377.181000,375.467010,386.944000,383.614990,375.071991,359.511993,328.865997,
320.510010,330.079010,336.187012,352.940002,365.026001,361.562012,362.299011,378.549011,390.414001,
400.869995,394.773010,382.556000])

PC_list = np.random.rand(len(list_))

number = 2
y_mean_list = []
xy_mean_list = []
for i in range(len(list_)-number):
    y_mean = sum(list_[i:i+number])/number
    xy_mean = sum([x * (i + 1) for i, x in enumerate(PC_list[i:i+number])])/number

    y_mean_list.append(y_mean)
    xy_mean_list.append(xy_mean)

ym = (np.convolve(list_, np.ones(shape=(number)), mode='valid')/number)[:-1]
xym = (np.convolve(PC_list, np.arange(number, 0, -1), mode='valid')/number)[:-1]

print(np.allclose(xym, xy_mean_list))
print(np.allclose(ym, y_mean_list))

【讨论】:

    猜你喜欢
    • 2021-01-29
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多