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 均值无法获取其他轴的主要内容,如果未能解决你的问题,请参考以下文章