簡體   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