python - 仅当满足每行元素的条件时,才计算 2D 数组特定列的均值和方差

标签 python arrays python-2.7 numpy

我有一个维度为(690L,15L)的二维numpy数组。 我需要仅在某些特定列中计算此数据集上的列均值,但有一个条件:当且仅当特定列的同一行中的元素满足条件时,我才需要包含一行。让我用一些代码来更清楚。

f = open("data.data")
dataset =  np.loadtxt(fname = f, delimiter = ',')

我有一个充满索引的数组,我需要在其中执行均值(和方差)

index_catego = [0, 3, 4, 5, 7, 8, 10, 11]

条件是数据集[i, 14] == 1 作为输出,我想要一个长度类似于 len(index_catego) 的一维数组,其中该数组的每个元素是前面列的平均值

output = [mean_of_index_0, mean_of_index_3, ..., mean_of_index_11]

我最近正在使用 Python,但我确信有一种很酷的方法可以使用 np.wheremasknp.mean 来实现此目的> 或其他东西。

我已经实现了一个解决方案,但它并不优雅,我不确定它是否正确。

import numpy as np

index_catego = [0, 3, 4, 5, 7, 8, 10, 11]

matrix_mean_positive = []
matrix_variance_positive = []
matrix_mean_negative = []
matrix_variance_negative = []

n_positive = 0
n_negative = 0

sum_positive = np.empty(len(index_catego))
sum_negative = np.empty(len(index_catego))


for i in range(dataset.shape[0]):
    if dataset[i, 14] == 0:
        n_positive = n_positive + 1
        j = 0
        for k in index_catego:
            sum_positive[j] = sum_positive[j] + dataset[i, k]
            j = j + 1
    else:
        n_negative = n_negative + 1
        j = 0
        for k in index_catego:
            sum_negative[j] = sum_negative[j] + dataset[i, k]
            j = j + 1

for item in np.nditer(sum_positive):
    matrix_mean_positive.append(item / n_positive)

for item in np.nditer(sum_negative):
    matrix_mean_negative.append(item / n_negative)

print(matrix_mean_positive)
print(matrix_mean_negative)

如果你想尝试你的解决方案,我提供了一些数据示例

1,22.08,11.46,2,4,4,1.585,0,0,0,1,2,100,1213,0
0,22.67,7,2,8,4,0.165,0,0,0,0,2,160,1,0
0,29.58,1.75,1,4,4,1.25,0,0,0,1,2,280,1,0
0,21.67,11.5,1,5,3,0,1,1,11,1,2,0,1,1
1,20.17,8.17,2,6,4,1.96,1,1,14,0,2,60,159,1
0,15.83,0.585,2,8,8,1.5,1,1,2,0,2,100,1,1
1,17.42,6.5,2,3,4,0.125,0,0,0,0,2,60,101,0

感谢您的帮助。

更新1: 我尝试过这个

output_positive = dataset[:, index_catego][dataset[:, 14] == 0]
mean_p = output_positive.mean(axis = 0)
print(mean_p)

output_negative = dataset[:, index_catego][dataset[:, 14] == 1]
mean_n = output_negative.mean(axis = 0)
print(mean_n)

但是意味着第一个解决方案(解决方案不酷)和第二个解决方案(单行酷解决方案)计算的结果都是不同的。 我检查了 dataset[:, index_catego][dataset[:, 14] == 0]dataset[:, index_catego][dataset[:, 14] == 1] 选择并且看起来正确(正确的尺寸和正确的元素)。

更新2: 好吧,第一个解决方案是错误的,因为(例如)第一列的元素只有 0 和 1,但平均值返回的值 > 1。我不知道我在哪里失败了。似乎正类是正确的(或者至少是合理的),而负类则根本不合理。

那么,第二个解决方案正确吗?有更好的方法吗?

更新3: 我想我发现了第一个解决方案的问题:我正在使用 jupyter 笔记本,有时(不是所有时候)当我重新运行第一个解决方案所在的同一单元格时,matrix_mean_positive 中的元素矩阵平均负数加倍。如果有人知道为什么,可以指出我吗?

现在两个解决方案返回相同的平均值。

最佳答案

在jupyter笔记本中执行Kernel->Restart以在重新运行之前清理内存

关于python - 仅当满足每行元素的条件时,才计算 2D 数组特定列的均值和方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52343946/

相关文章:

python - 多维稀疏数据的最佳数据结构

java - Word 拓扑部署错误

arrays - 子数组由可以按连续顺序排列的数字组成。

delphi - 组合多个 TBytes 数组的最佳方式

python - 如何使用 PIL\Numpy 在 Python 中获取灰度图像的平均像素值?

python - 在 Pandas 中读取、选择和重新排列列

Python:如果字典键一致

python - 元组中的日期时间对象无法使用模板正确打印

Python One-Liner : Sorting by multiple, 相互依赖的键

java - 如何在不循环的情况下顺序填充数组或数组列表?