仅当满足每行元素的条件时,才计算二维数组特定列的均值和方差
Posted
技术标签:
【中文标题】仅当满足每行元素的条件时,才计算二维数组特定列的均值和方差【英文标题】:Compute mean and variance on specific columns of 2D array only if a condition on element on each row is satisfied 【发布时间】:2019-02-19 23:22:12 【问题描述】:我有一个尺寸为 (690L, 15L) 的 2D numpy 数组。 我需要仅在某些特定列中计算此数据集的列明智平均值,但有一个条件:当且仅当特定列的同一行中的元素满足条件时,我才需要包含一行。让我用一些代码更清楚。
f = open("data.data")
dataset = np.loadtxt(fname = f, delimiter = ',')
我有一个数组,其中包含我需要执行均值(和方差)的索引
index_catego = [0, 3, 4, 5, 7, 8, 10, 11]
条件是dataset[i, 14] == 1
作为输出,我想要一个长度为 len(index_catego)
的一维数组,其中该数组的每个元素都是先前列的平均值
output = [mean_of_index_0, mean_of_index_3, ..., mean_of_index_11]
我最近在使用 Python,但我确信使用 np.where
、mask
、np.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 notebook,有时(不是所有时间)当我重新运行第一个解决方案所在的同一单元格时,matrix_mean_positive
和 matrix_mean_negative
中的元素加倍。如果有人知道为什么,可以指点我吗?
现在两种解决方案都返回相同的方法。
【问题讨论】:
dataset[:, index_catego][dataset[:, 14] == 0]
可能是一个解决方案?
【参考方案1】:
Do Kernel->Restart in jupyter notebook 清理内存后再重新运行
【讨论】:
以上是关于仅当满足每行元素的条件时,才计算二维数组特定列的均值和方差的主要内容,如果未能解决你的问题,请参考以下文章
仅当数组中的所有元素都符合 MongoDb 中的条件时才获取文档