繁体   English   中英

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

[英]TypeError / Array indexing; 'int' object does not support item assignment

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

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

要创建一个填充了nan的空数组,可以使用np.fill

a=np.empty(np.shape(1))
a.fill(np.nan)
b=False

a[b]=10

你得到一个错误,因为a不是一个数组,它是一个浮点数。

在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.float64 a.item()做同样的a.item()

出于分配目的,我找不到改变该项目价值的方法

a[???] = 0   

更正,省略号可以使用,因为它代表任意数量:包括无。

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布尔索引。

当您将标量数组乘以标量时,numpy会将结果强制转换为标量:

>>> a = np.empty(())
>>> a
array(10.0)
>>> a * 2
20.0

如果你需要将标量保持为数组,可以使用np.asarray(a * 2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM