我有一个函数可以处理具有多个项目的数组,但如果数组只包含一个项目,则会失败。让我们考虑这个例子
import numpy as np
def checker(a):
a[a>5] = np.nan
a = np.arange(10)
a = checker(a)
工作,但
a = 1
a = checker(a) # fails
并给出
Traceback (most recent call last):
a[a>5] = np.nan
TypeError: 'int' object does not support item assignment
我想像MATLAB一样处理它,而不是像这个版本的checker()那样,它的行数比上面的版本多4倍。
def checker(a):
try:
a[a>5] = np.nan
except TypeError:
if a>5: a = np.nan
答案 0 :(得分:0)
要创建一个填充nan
的空数组,您可以使用np.fill
:
a=np.empty(np.shape(1))
a.fill(np.nan)
b=False
a[b]=10
您收到错误,因为a
不是数组,而是浮点数。
答案 1 :(得分:0)
在MATLAB中,一切都至少有2个维度;在numpy
索引中可以减少维度数
np.shape(1)
是()
?这与np.array(1).shape
相同,即单个元素数组的形状(MATLAB术语中的大小)。它是0d,而不是MATLAB中的2d。
a = np.empty(np.shape(1))*np.nan
# a = np.array(np.nan) does the same thing
是nan
,是一个值为nan
的单个元素数组。
a[False]
显示为array([], dtype=float)
,形状为(0,)
;它现在是1d,但没有任何元素。
使用0d数组时,唯一有意义的索引是a[()]
,它返回元素nan
,np.float64
。 a.item()
也是如此。
为了分配目的,我找不到改变该项目价值的方法
a[???] = 0
更正,可以使用省略号,因为它代表任意数量的:
,包括无。{/ p>
a[...] = 0
# array(0,0)
(你没有魔杖a=0
,因为那只是重新分配变量)。
一般来说,像这样的0d数组是可能的,但它们很少有用。
我不完全确定你要做什么(我目前没有工作的Octave会议)。但是,尺寸如何随着索引而变化的差异是解决问题的关键。
a = np.array([np.nan])
a[np.array([False])] = 0 # no change
a[np.array([True])] = 0 # change
请注意,我将布尔索引设为数组,但只是标量或列表。这更接近您的MATLAB布尔索引。
答案 2 :(得分:0)
当你将标量数组乘以标量时,numpy会将结果强制转换为标量:
>>> a = np.empty(())
>>> a
array(10.0)
>>> a * 2
20.0
如果您需要将标量保持为数组,则可以使用np.asarray(a * 2)