(注:原来的问题有点不同,另一个答案适用;原始问题见修订史。)
是否有一种统一的方法来索引numpy数组,而这些数组也可以是标量的?
我正在尝试编写一个处理浮点、浮点数列表或0/1D numpy数组的函数。为了统一处理这个问题,我使用了numpy.asarray(),它总体工作良好(当输入是标准的Python时,我不介意返回一个numpy.float64 )。
当我需要处理条件操作和中间数组函数时,会出现问题,如下所示:
value = np.asarray(5.5)
mask = value > 5
tmpvalue = np.asarray(np.cos(value))
tmpvalue[mask] = value这将引发异常:
Traceback (most recent call last):
File "testscalars.py", line 27, in <module>
tmpvalue[mask] = value
IndexError: 0-d arrays can't be indexed有什么优雅的解决办法吗?
发布于 2015-07-03 03:21:09
事实证明,这个问题与numpy 1.8及以前有关;升级到numpy 1.9(.2)解决了这个问题。
numpy 1.9发行说明有这样的说法:
对标量数组的布尔索引将始终返回一个新的一维数组。这意味着数组(1)数组(True)提供的是数组(1),而不是原始数组。
这将方便地将tmpvalue[mask]临时转换为一维数组,允许将其分配给value。
tmpvalue[mask] = value发布于 2015-06-24 03:47:19
虽然对所提问题的实际答案并不是实际的,但以下主要是咬我并导致(类型)错误的原因:
value = numpy.asarray(5.5)
mask = value > 5
tmpvalue = numpy.cos(value)
tmpvalue[mask] = value[mask]这里的问题是值是numpy.ndarray类型的,但是由于它是一个0-d数组,所以numpy.cos返回一个numpy.scalar,它不能被索引。
我认为这个冷酷的问题与这个问题直接相关。
现在看来,最简单的解决方案是用numpy.asarray包装numpy ufuncs。
value = numpy.asarray(5.5)
mask = value > 5
tmpvalue = numpy.asarray(numpy.cos(value))
tmpvalue[mask] = value[mask]我已经成功地测试了输入5.5、4.5、[5.5]、[4.5]和[4.5, 5.5]。
请注意,这种行为也适用于更常见的操作,如加法:
>>> x = numpy.asarray(5)
>>> y = numpy.asarray(6)
>>> z = x + y
>>> type(x), type(y), type(z)
(<class 'numpy.ndarray'>, <class 'numpy.ndarray'>, <class 'numpy.int64'>)https://stackoverflow.com/questions/30996934
复制相似问题