Numpy 均值无法获取其他轴

Posted

技术标签:

【中文标题】Numpy 均值无法获取其他轴【英文标题】:Numpy mean cannot get other axis 【发布时间】:2022-01-19 16:18:29 【问题描述】:

我的 numpy 对象为:

[array([1, 1, 1]) array([2, 2, 2])
 array([3, 3, 3]) array([4, 4, 4])
 array([5, 5, 5]) array([6, 6, 6])]

我的目标是获取所有子数组中平均值的列表/数组,即获取列表 [1 2 3 4 5 6]。

我得到了 np.mean 和 np.average: [3.5 3.5 3.5] 这是所有第一个、所有第二个、所有第三个元素的平均值。

我尝试添加一个参数axis=1,但随后出现错误:

    avg = a.mean(axis)
  File "---/numpy/core/_methods.py", line 138, in _mean
    rcount = _count_reduce_items(arr, axis)
  File "---/numpy/core/_methods.py", line 57, in _count_reduce_items
    items *= arr.shape[ax]
IndexError: tuple index out of range

我尝试将我的对象转换为 np.array 但这没有任何区别。

正如我所评论的,这是我的问题的最小重现:

import numpy as np
A = np.zeros((2,2), dtype=object)
A[0][0] = np.append(A[0][0], np.array([1]))
A[0][1] = np.append(A[0][1], np.array([2]))
print(np.array(A[0,:]).mean())          # ok
print(np.array(A[0,:]).mean(axis=0))    # ok
np.array(A[0,:]).mean(axis=1)           # bad

【问题讨论】:

np.mean(l, axis=1) 在 numpy 1.21.2 上返回正确答案 array([1,2,3,4,5,6])。你也可以试试np.array(l).mean(axis=1) 又是同样的错误 你的 numpy 对象到底是什么,你用type(l)得到什么? <class 'numpy.ndarray'> 请查看我关于如何报告错误的评论 如前所述,np.array(list(A[0,:])).mean(axis=1) 应该适合您。 【参考方案1】:

我想你想写a.mean(axis=axis)。完整的解决方案:

代码

from numpy import array

a = array(
    [
        array([1, 1, 1]),
        array([2, 2, 2]),
        array([3, 3, 3]),
        array([4, 4, 4]),
        array([5, 5, 5]),
        array([6, 6, 6]),
    ]
)
axis = 1

print(a.mean(axis=axis))

输出

[1. 2. 3. 4. 5. 6.]

【讨论】:

不起作用,我的对象内部数组之间没有逗号 没有逗号就不会是正确的语法。【参考方案2】:
>>> obj = [np.array([1, 1, 1]), np.array([2, 2, 2]),  np.array([3, 3, 3]), np.array([4, 4, 4]),  np.array([5, 5, 5]), np.array([6, 6, 6])]
>>> np.array(obj).mean(axis=1).tolist()
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]

获取整数

>>> np.array(obj).mean(axis=1, dtype=np.int32).tolist()
[1, 2, 3, 4, 5, 6]

在你的情况下,

import numpy as np
A = np.zeros((2,2), dtype=object)
A[0] = np.array([1])
A[1] = np.array([2])
A.mean(axis=1).tolist()

输出: [1.0, 2.0]

【讨论】:

与帖子中的错误相同;为简单起见,我只在测试时打印结果,因此转换为列表没有问题 问题已经是没有axis=1【参考方案3】:

从原始显示创建一个数组 - 通过一些调整,生成一个二维数组:

In [23]: array=np.array
    ...: alist = [array([1, 1, 1]), array([2, 2, 2]),
    ...:  array([3, 3, 3]), array([4, 4, 4]),
    ...:  array([5, 5, 5]), array([6, 6, 6])]
In [24]: alist
Out[24]: 
[array([1, 1, 1]),
 array([2, 2, 2]),
 array([3, 3, 3]),
 array([4, 4, 4]),
 array([5, 5, 5]),
 array([6, 6, 6])]
In [25]: np.array(alist)
Out[25]: 
array([[1, 1, 1],
       [2, 2, 2],
       [3, 3, 3],
       [4, 4, 4],
       [5, 5, 5],
       [6, 6, 6]])
In [26]: np.array(alist).mean(axis=1)
Out[26]: array([1., 2., 3., 4., 5., 6.])

从该列表中创建一个 6 元素对象 dtype 数组

In [29]: A = np.zeros((6),object)
In [30]: A[:]=alist
In [31]: A
Out[31]: 
array([array([1, 1, 1]), array([2, 2, 2]), array([3, 3, 3]),
       array([4, 4, 4]), array([5, 5, 5]), array([6, 6, 6])], dtype=object)
In [32]: A.shape
Out[32]: (6,)
In [33]: A.mean()
Out[33]: array([3, 3, 3])
In [35]: A.sum()
Out[35]: array([21, 21, 21])

mean 所做的是将 6 个数组加在一起得到 [35],然后除以 6 得到平均值(截断为 int)。

要获得各个数组的平均值,请使用列表推导:

In [36]: [a.mean() for a in A]
Out[36]: [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]

或者把它变成一个二维数组:

In [37]: np.stack(A).mean(axis=1)
Out[37]: array([1., 2., 3., 4., 5., 6.])

您的初始数组显示有点模棱两可。它看起来很像数组列表,只是缺少逗号。数组的repr 打印会更清晰,更像我的Out[31]

In [38]: print(A)
[array([1, 1, 1]) array([2, 2, 2]) array([3, 3, 3]) array([4, 4, 4])
 array([5, 5, 5]) array([6, 6, 6])]

形状为 (6,) 的对象 dtype 数组与形状为 (6,3) 的数值 dtype 数组不同。 mean 和索引之类的函数不会“穿过”该对象边界。 A 没有“其他”轴;它只有一个。

【讨论】:

以上是关于Numpy 均值无法获取其他轴的主要内容,如果未能解决你的问题,请参考以下文章

Numpynumpy.mean() 的用法

NumPy 中多轴的平均值

基于 2D 数组的 3D numpy 切片的平均值

如何使用逐元素操作获取多个 numpy 保存的数组的均值和标准

numpy基础二

numpy/python 中的加权平均值