首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >0D &一维numpy阵列数组索引的统一方法

0D &一维numpy阵列数组索引的统一方法
EN

Stack Overflow用户
提问于 2015-06-23 07:52:46
回答 2查看 649关注 0票数 3

(注:原来的问题有点不同,另一个答案适用;原始问题见修订史。)

是否有一种统一的方法来索引numpy数组,而这些数组也可以是标量的?

我正在尝试编写一个处理浮点、浮点数列表或0/1D numpy数组的函数。为了统一处理这个问题,我使用了numpy.asarray(),它总体工作良好(当输入是标准的Python时,我不介意返回一个numpy.float64 )。

当我需要处理条件操作和中间数组函数时,会出现问题,如下所示:

代码语言:javascript
运行
复制
value = np.asarray(5.5)
mask = value > 5
tmpvalue = np.asarray(np.cos(value))
tmpvalue[mask] = value

这将引发异常:

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "testscalars.py", line 27, in <module>
    tmpvalue[mask] = value
IndexError: 0-d arrays can't be indexed

有什么优雅的解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-03 03:21:09

事实证明,这个问题与numpy 1.8及以前有关;升级到numpy 1.9(.2)解决了这个问题。

numpy 1.9发行说明有这样的说法:

对标量数组的布尔索引将始终返回一个新的一维数组。这意味着数组(1)数组(True)提供的是数组(1),而不是原始数组。

这将方便地将tmpvalue[mask]临时转换为一维数组,允许将其分配给value

代码语言:javascript
运行
复制
tmpvalue[mask] = value
票数 1
EN

Stack Overflow用户

发布于 2015-06-24 03:47:19

虽然对所提问题的实际答案并不是实际的,但以下主要是咬我并导致(类型)错误的原因:

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
value = numpy.asarray(5.5)
mask = value > 5
tmpvalue = numpy.asarray(numpy.cos(value))
tmpvalue[mask] = value[mask]

我已经成功地测试了输入5.54.5[5.5][4.5][4.5, 5.5]

请注意,这种行为也适用于更常见的操作,如加法:

代码语言:javascript
运行
复制
>>> 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'>)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30996934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档