[英]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[()]
,它返回元素nan
, np.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.