我有一个Python函数,它通常处理numpy数组,它执行如下操作:
result = a*x
result[a<=0] = float('NaN')但是,有时x和/或a只是浮点数,当这种情况发生时,代码会失败。为了处理这种情况,我目前正在这样做:
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')这正是我想要做的,但是它需要代码伪复制,当我们有许多参数a、b、c、.或者更复杂的条件,容易出错。
我试过了
x = np.asarray(x).astype(float)
a = np.asarray(a).astype(float)
result = a*x
result[a<=0] = float('NaN')但它产生了
TypeError: 'numpy.float64' object does not support item assignment有更好的方法吗?我希望保留表示法result[a<=0]=float('NaN'),如果a是标量,则将其应用于result的所有元素,而不必手动检查它是否为维度0。
发布于 2022-02-05 18:52:42
听起来,您希望numpy标量的行为像一个元素的一维数组,而其他的一切都正常运行(问题是numpy数组是可变的,但标量不是可变的)。从语义上讲,正确的工具是np.atleast_1d()
# dummy input
a = np.array(1.0)
x = np.array(42.0)
result = np.atleast_1d(a*x)
result[a <= 0] = np.nan这给了你
>>> result
array([42.])听起来像是你想要结束的事情。如果出于某种原因,您希望将结果改为标量(我不建议这样做,因为这会使类似的循环从下游跳过),您可以使用多种方法来转换结果,但具体的实现方式将取决于您所期望的行为(考虑边情况,例如1d-vs-0d单元素情况)。
https://stackoverflow.com/questions/70999906
复制相似问题