TypeError / Array索引; ' INT'对象不支持项目分配

时间:2016-04-21 15:50:36

标签: python numpy

我有一个函数可以处理具有多个项目的数组,但如果数组只包含一个项目,则会失败。让我们考虑这个例子

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

3 个答案:

答案 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[()],它返回元素nannp.float64a.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)