python - 如何在多个一维numpy数组中的元素之间采用模式
问题描述
我可以逐个元素地跨多个列表/数组求和,根据
sum([np.array([1,2,3,4,5]), np.array([1,2,3,4,5])]) = array([ 2, 4, 6, 8, 10])
我想对数组中每个元素的模式做类似的事情,并得到预期的结果:
mode([np.array([1,2,3,4,5]), np.array([1,2,3,4,5])]) = array([ 1, 2, 3, 4, 5]
)
在没有单一模式的情况下,我想随机选择其中一个数组中的元素作为输出,如下所示:
mode([np.array([0,2,3,4,0]), np.array([1,2,9,4,5])]) = array([ 1, 2, 9, 4, 0]
)
最后,我希望能够跨任意数量的等长数组执行此操作。
注意:我尝试使用 stats library 模式,并得到以下错误:
>>> mode([np.array([1,2,3,4,5]), np.array([1,2,3,4,5])])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/anaconda3/lib/python3.7/statistics.py", line 501, in mode
table = _counts(data)
File "/anaconda3/lib/python3.7/statistics.py", line 252, in _counts
table = collections.Counter(iter(data)).most_common()
File "/anaconda3/lib/python3.7/collections/__init__.py", line 566, in __init__
self.update(*args, **kwds)
File "/anaconda3/lib/python3.7/collections/__init__.py", line 653, in update
_count_elements(self, iterable)
TypeError: unhashable type: 'numpy.ndarray'
仅使用列表时也会引发错误。
因此,我正在寻找一种方法来实现这一目标。
一个关键要求是跨数组元素的模式输出向量必须与每个向量的长度相同(我将把它输入到混淆矩阵中,以便与参考向量进行比较)。
解决方案
您可以使用 找到模式scipy.stats.mode
。您还可以将多个 numpy 数组连接成一个数组,然后将其提供给 mode。
import numpy as np
import scipy.stats
arrays = [np.array([0,2,3,4,0]), np.array([1,2,9,4,5])]
result = scipy.stats.mode(np.concatenate(arrays))
# ModeResult(mode=array([0]), count=array([2]))
result.mode
# array([0])
的返回值scipy.stats.mode
是一个命名元组ModeResult
,其中包括模式和值出现的次数。
要查找每列的模式,您可以将数组堆叠成二维数组,然后沿着第一个轴查找模式。
arrays = [
np.array([0, 2, 3, 4, 0]),
np.array([1, 2, 9, 4, 5]),
np.array([0, 9, 9, 4, 1])]
result = scipy.stats.mode(np.stack(arrays), axis=0)
result.mode
# array([[0, 2, 9, 4, 0]])
推荐阅读
- c++ - 如何从 C++ 中的文本文件中获取特定字符串
- node.js - 在下一个 js 中使用 webpack5 刷新不需要的页面
- javascript - React - 使用嵌套对象作为带有钩子的状态来填充表单数据
- python - 在 django-tables2 中显示图像
- nginx - 不同路径上代理后面的私有 NPM 注册表
- python-3.x - 熊猫列名搜索并将注释列值附加到前一行值python
- javascript - 从外部脚本登录后调用 VueJS 组件
- javascript - 冒号运算符“:”作为“=”发送
- asp.net - 如何手动将 .nupkg Nuget 包添加到 VS Code?
- python - Python禁用键盘输入