首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动处理用于项分配的数组和标量

自动处理用于项分配的数组和标量
EN

Stack Overflow用户
提问于 2022-02-05 16:30:28
回答 1查看 50关注 0票数 1

我有一个Python函数,它通常处理numpy数组,它执行如下操作:

代码语言:javascript
复制
result = a*x
result[a<=0] = float('NaN')

但是,有时x和/或a只是浮点数,当这种情况发生时,代码会失败。为了处理这种情况,我目前正在这样做:

代码语言:javascript
复制
x = np.asarray(x).astype(float)
a = np.asarray(a).astype(float)
result = a*x
if a.shape == ():
    if a <= 0:
        result *= float('NaN')
else:
    result[a<=0] = float('NaN')

这正是我想要做的,但是它需要代码伪复制,当我们有许多参数abc、.或者更复杂的条件,容易出错。

我试过了

代码语言:javascript
复制
x = np.asarray(x).astype(float)
a = np.asarray(a).astype(float)
result = a*x
result[a<=0] = float('NaN')

但它产生了

代码语言:javascript
复制
TypeError: 'numpy.float64' object does not support item assignment

有更好的方法吗?我希望保留表示法result[a<=0]=float('NaN'),如果a是标量,则将其应用于result的所有元素,而不必手动检查它是否为维度0。

EN

回答 1

Stack Overflow用户

发布于 2022-02-05 18:52:42

听起来,您希望numpy标量的行为像一个元素的一维数组,而其他的一切都正常运行(问题是numpy数组是可变的,但标量不是可变的)。从语义上讲,正确的工具是np.atleast_1d()

代码语言:javascript
复制
# dummy input
a = np.array(1.0)
x = np.array(42.0)

result = np.atleast_1d(a*x)
result[a <= 0] = np.nan

这给了你

代码语言:javascript
复制
>>> result
array([42.])

听起来像是你想要结束的事情。如果出于某种原因,您希望将结果改为标量(我不建议这样做,因为这会使类似的循环从下游跳过),您可以使用多种方法来转换结果,但具体的实现方式将取决于您所期望的行为(考虑边情况,例如1d-vs-0d单元素情况)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70999906

复制
相关文章

相似问题

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