SciPy PearsonR ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

Posted

技术标签:

【中文标题】SciPy PearsonR ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()【英文标题】:SciPy PearsonR ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 【发布时间】:2015-05-04 15:58:24 【问题描述】:

我在使用来自 SciPy 的 pearsonr 方法时遇到了一些问题。我试图让它尽可能简单(注意华丽的 N^2 循环),但我仍然遇到了这个问题。我不完全明白我要去哪里错了。我的数组被正确选择,并且具有相同的维度。

我运行的代码是:

from scipy import stats
from sklearn.preprocessing import LabelBinarizer, Binarizer
from sklearn.feature_extraction.text import CountVectorizer

ny_cluster = LabelBinarizer().fit_transform(ny_raw.clusterid.values)
ny_vocab = Binarizer().fit_transform(CountVectorizer().fit_transform(ny_raw.text.values))

ny_vc_phi = np.zeros((ny_vocab.shape[1], ny_cluster.shape[1]))
for i in xrange(ny_vc_phi.shape[0]):
    for j in xrange(ny_vc_phi.shape[1]):
        ny_vc_phi[i,j] = stats.pearsonr(ny_vocab[:,i].todense(), ny_cluster[:,j])[0]

产生错误的原因:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/data/TweetClusters/TweetsLocationBayesClf/<ipython-input-29-ff1c3ac4156d> in <module>()
      3 for i in xrange(ny_vc_phi.shape[0]):
      4     for j in xrange(ny_vc_phi.shape[1]):
----> 5         ny_vc_phi[i,j] = stats.pearsonr(ny_vocab[:,i].todense(), ny_cluster[:,j])[0]
      6 

/usr/lib/python2.7/dist-packages/scipy/stats/stats.pyc in pearsonr(x, y)
   2201     # Presumably, if abs(r) > 1, then it is only some small artifact of floating

   2202     # point arithmetic.

-> 2203     r = max(min(r, 1.0), -1.0)
   2204     df = n-2
   2205     if abs(r) == 1.0:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我真的不明白这个选择在哪里进行。当然,我不知道如何计算 r 变量也无济于事。会不会是我弄乱了我的输入?

【问题讨论】:

【参考方案1】:

检查pearsonr 的参数是一维 数组。也就是说,ny_vocab[:,i].todense()ny_cluster[:,j] 都应该是一维的。试试:

    ny_vc_phi[i,j] = stats.pearsonr(ny_vocab[:,i].todense().ravel(), ny_cluster[:,j].ravel())[0]

(我在pearsonr 的每个参数中添加了对ravel() 的调用。)

【讨论】:

这非常接近我的解决方案,所以我将其标记为已回答。对于任何想知道的人,我使用的是稀疏矩阵,因此需要包含一个数组转换。对于任何想知道的人,这行逐字是ny_vc_phi[i,j] = stats.pearsonr(np.squeeze(np.asarray(ny_vocab[:,i].todense())), ny_cluster[:,j])[0] 我正要编辑问题并建议 squeeze 作为替代方案,如果问题只是一个“微不足道”的维度,但你打败了我。 :-)

以上是关于SciPy PearsonR ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()的主要内容,如果未能解决你的问题,请参考以下文章

scipy稀疏矩阵和numpy数组之间的点积给出ValueError

Scipy IO Loadmat 错误:ValueError:Mat 4 mopt 格式错误

scipy.optimize.curve_fit ValueError:具有多个元素的数组的真值不明确

使用 scipy.optimize.curve_fit - ValueError 和 minpack.error 拟合 2D 高斯函数

使用 scipy.signal.lfilter 时,实现 Butterworth 带通滤波器遇到:“ValueError: object of too small depth for desired

在scipy中,chi与SPSS中的结果不同