[英]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.