我有一个numpy数组,它有100行和16026列。我必须找到每一列的中位数。因此,每一列的中位数将根据100次观测(本例中为100行)计算。我使用以下代码来实现这一点:
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)这是我得到的输出:
(100, 16026)
(100, 16026)
(100, 16026)
(100, 16026)我的问题是-为什么medArray 100*16026的形状不是1*16026?因为我正在计算每一列的中位数,所以我只期望有16026列的一行。我在这里错过了什么?
请注意,X_train是一个稀疏矩阵。
X_train.shape产出:
(2034, 16026)在这方面的任何帮助都是非常感谢的。
编辑:
利用toarray()函数解决了上述问题。
tempArray = X_train[indices, ].toarray(),我也觉得我很愚蠢,并且把所有的零都包含在我的中位数计算中,这就是为什么我总是把0作为中位数。是否有一种通过移除/忽略所有列的零来计算中值的简单方法?
发布于 2014-02-26 23:56:03
我终于解决了这个问题。我使用了蒙面数组和以下代码:
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])这给了我忽略零点的中间值。
发布于 2014-02-26 03:51:42
这真的很奇怪,我想你应该去找(16026,),我们是不是遗漏了什么:
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结果的唯一方法是:
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时,解决这个问题的一个愚蠢的方法可能是:
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指出的。
对此,可能有更好的解释。
发布于 2014-02-26 05:04:09
问题是NumPy不将稀疏矩阵识别为数组或类似数组的对象。例如,对稀疏矩阵调用asanyarray返回一个0D数组,该数组的一个元素是原始稀疏矩阵:
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,如果你给它一个稀疏矩阵,就不会理解它在看什么。
https://stackoverflow.com/questions/22031122
复制相似问题