2016-04-21 55 views
1

我有一個函數可以處理具有多個項目的數組,但如果數組只包含一個項目,則會失敗。讓我們看看這個例子TypeError/Array索引; 'int'對象不支持項目分配

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,而不是像這個版本檢查的()比上面的版本多出4倍的線。

def checker(a): 
    try: 
     a[a>5] = np.nan 
    except TypeError: 
     if a>5: a = np.nan 
+0

你是什麼試圖在這裏做? – Eric

+0

我試圖計算一些東西,只要滿足一些條件 – Lukas

回答

0

在MATLAB中,每件東西至少有2個dimensons;在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.float64a.item()也是這樣。

而對於分配目的,我無法找到一個方法來改變項目

a[???] = 0 

修正值,省略號可以使用,因爲它代表在任意數量的:包括空。

a[...] = 0 
# array(0,0) 

(你沒有準備a=0,因爲它只是重新分配變量)。

通常這樣的0d數組是可能的,但它們很少有用。

我不完全確定你正在嘗試做什麼(我目前沒有正在工作的八音度會話)。但尺寸如何隨着索引而變化的差異是解決問題的關鍵。

a = np.array([np.nan]) 
a[np.array([False])] = 0 # no change 
a[np.array([True])] = 0 # change 

注意,我做了布爾指數的陣列,而只是一個標量或列表。這更接近你的MATLAB布爾指數。

+0

它最終會產生以下問題: http://stackoverflow.com/questions/25458553/is-there-a-pythonic-way-to-change-scalar - 和 - 0D陣列1D陣列 http://stackoverflow.com/questions/773030/why-are-0d-arrays-in-numpy-not-considered-scalar?lq=1 – Lukas

+0

該鏈接提醒我可以使用[a] = 0'來改變任何維度對象的值。但我不明白這將如何幫助改變/不改變問題。 – hpaulj

0

要創建充滿nan秒的空數組,你可以使用np.fill

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

a[b]=10 

你都拿到一個錯誤,因爲a是不是一個數組,這是一個浮動。

0

當你乘以一個標量標量數組,numpy的強制轉換的結果爲標:

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

如果你需要保持標爲數組,你可以使用np.asarray(a * 2)

相關問題