首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么np.median()返回多行?

为什么np.median()返回多行?
EN

Stack Overflow用户
提问于 2014-02-26 03:28:27
回答 3查看 1.2K关注 0票数 3

我有一个numpy数组,它有100行和16026列。我必须找到每一列的中位数。因此,每一列的中位数将根据100次观测(本例中为100行)计算。我使用以下代码来实现这一点:

代码语言:javascript
复制
for category in categories:
    indices = np.random.randint(0, len(os.listdir(filepath + category)) - 1, 100)
    tempArray = X_train[indices, ]
    medArray = np.median(tempArray, axis=0)
    print(medArray.shape)

这是我得到的输出:

代码语言:javascript
复制
(100, 16026)
(100, 16026)
(100, 16026)
(100, 16026)

我的问题是-为什么medArray 100*16026的形状不是1*16026?因为我正在计算每一列的中位数,所以我只期望有16026列的一行。我在这里错过了什么?

请注意,X_train是一个稀疏矩阵。

代码语言:javascript
复制
X_train.shape

产出:

代码语言:javascript
复制
(2034, 16026)

在这方面的任何帮助都是非常感谢的。

编辑:

利用toarray()函数解决了上述问题。

代码语言:javascript
复制
tempArray = X_train[indices, ].toarray()

,我也觉得我很愚蠢,并且把所有的零都包含在我的中位数计算中,这就是为什么我总是把0作为中位数。是否有一种通过移除/忽略所有列的零来计算中值的简单方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-26 23:56:03

我终于解决了这个问题。我使用了蒙面数组和以下代码:

代码语言:javascript
复制
 sample = [] 
    sample_size = 50
    idx = matplotlib.mlab.find(newsgroups_train.target==i)
    random_index = []
    for j in range(sample_size):
        random_index.append(randrange(0,len(idx)-1)) 

y = np.ma.masked_where(X_train[sample[0]].toarray() == 0, X_train[sample[0]].toarray())
    medArray = np.ma.median(y, axis=0).filled(0)
    print '============median ' + newsgroups_train.target_names[i] + '============='
    for k,word in enumerate(np.array(vectorizer.get_feature_names())[np.argsort(medArray)[::-1][0:10]]):
        print word + ':' + str(np.sort(medArray)[::-1][k])

这给了我忽略零点的中间值。

票数 1
EN

Stack Overflow用户

发布于 2014-02-26 03:51:42

这真的很奇怪,我想你应该去找(16026,),我们是不是遗漏了什么:

代码语言:javascript
复制
In [241]:

X_train=np.random.random((1000,16026)) #1000 can be any int.
indices = np.random.randint(0, 60, 100) #60 can be any int.
tempArray = X_train[indices, ]
medArray = np.median(tempArray, axis=0)
print(medArray.shape)

(16026,)

获得2d array结果的唯一方法是:

代码语言:javascript
复制
In [243]:

X_train=np.random.random((100,2,16026))
indices = np.random.randint(0, 60, 100)
tempArray = X_train[indices, ]
medArray = np.median(tempArray, axis=0)
print(medArray.shape)


(2, 16026)

当您有3d array输入时。

当它是一个sparse array时,解决这个问题的一个愚蠢的方法可能是:

代码语言:javascript
复制
In [319]:

X_train = sparse.rand(112, 16026, 0.5, 'csr') #just make up a random sparse array
indices = np.random.randint(0, 60, 100)
tempArray = X_train[indices, ]
medArray = np.median(tempArray.toarray(), axis=0)
print(medArray.shape)
(16026,)

.toarray()也可能转到第3行。但不管怎样,这意味着0也被计算为@zhangxaochen指出的。

对此,可能有更好的解释。

票数 1
EN

Stack Overflow用户

发布于 2014-02-26 05:04:09

问题是NumPy不将稀疏矩阵识别为数组或类似数组的对象。例如,对稀疏矩阵调用asanyarray返回一个0D数组,该数组的一个元素是原始稀疏矩阵:

代码语言:javascript
复制
In [8]: numpy.asanyarray(scipy.sparse.csc_matrix([[1,2,3],[4,5,6]]))
Out[8]:
array(<2x3 sparse matrix of type '<type 'numpy.int64'>'
        with 6 stored elements in Compressed Sparse Column format>, dtype=object)

与大多数NumPy一样,numpy.median依赖于将数组或类似数组的对象作为输入。它所依赖的例程,特别是sort,如果你给它一个稀疏矩阵,就不会理解它在看什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22031122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档