【发布时间】:2017-06-27 21:43:22
【问题描述】:
我想计算轴 1 上一些嵌套二维数组的最小值。
我的问题如下:数组可能有 1 个(或更多)空轴,如果我尝试在其上应用 np.min 会引发一些错误。
请注意,如果轴为空,我希望代码返回 -1(通过初始化,我的数组不能有负值)。
例如,我可能希望将m 的最小值定义如下:
import numpy as np
m = np.array([np.array([1,2]),np.array([3,4,5,6]),np.array([]),np.array([7,8,9])])
# Expected output in this case: [1,3,-1,7]
我第一次尝试:
_min = np.min(m, axis=1)
这给出了以下错误:
ValueError: 'axis' 条目超出范围
所以,由于错误来自嵌套数组(它的形状为(4,),我尝试了:
_min = [np.min(x) for x in m]
哪个投掷:
ValueError: 零大小数组到没有标识的归约操作最小值
这里的错误来自 m[2] = [] 这是一个零大小的数组。
我想出的只是这个低效且丑陋的解决方案:
_min = []
for x in m:
if len(x) > 0:
_min.append(np.min(x))
else:
_min.append(-1)
# [1, 3, -1, 7]
有没有一种简单的方法可以用更 Python 的方式来实现?
编辑
@Divakar 提出的 pythonic 解决方案在空轴是最后一个元素时不起作用(m[-1]):
m = np.array([np.array([0.53, 0.56]), np.array([0.33, 0.31, 0.27, 0.48, 0.36, 0.35, 0.27, 0.24]), np.array([])])
给出的错误:
IndexError: index 10 out-of-bounds in minimum.reduceat [0, 10)
【问题讨论】:
-
这不是一个嵌套的
np.array,而是一个list的数组。 NumPy 1.13 对此更加明确,将您的m数组显示为array([list([1, 2]), list([3, 4, 5, 6]), list([]), list([7, 8, 9])], dtype=object) -
@Eric 当我明确定义为 np.array-s 时,我遇到了同样的错误。例如:
m = np.array([np.array([0.53, 0.56]), np.array([0.33, 0.31, 0.27, 0.48, 0.36, 0.35, 0.27, 0.24]), np.array([])]) -
确实如此,但仍然值得意识到那些东西不一样
-
@Eric 我的错误,在我的代码中它是作为嵌套的 np.array 生成的,我在写我的小例子时忘记添加它。我编辑了问题以解决它。感谢您的关注
标签: python arrays numpy multidimensional-array