2015-04-06 26 views
1

我無法修改循環中numpy數組的實際值。 我的代碼如下:修改數組numpy中的實際元素值

labels_class = np.copy(labels_train) 
for label in labels_class: 
    labels_class[label] = 1 if (label == classifier) else 0 

labels_class - 是大小爲N的和值[0,39]只是numpy的陣列。 循環中的值labels_class[label]正確(==已修改),但循環外部的labels_class保持不變。

我也曾嘗試nditer,沒有工作:

for label in np.nditer(labels_class, op_flags=['readwrite']): 
     label = 1 if (label == classifier) else 0 

reference,據說

「實際修改數組的元素,X應與省略號索引」

我該怎麼做?什麼是語法?

+2

也許你打算通過numpy數組[enumerate](https://docs.python.org/2/library/functions.html#enumerate)。簡單地遍歷迭代器會產生迭代器的元素,而不是元素的索引。 – Shashank

+0

我的意思是訪問循環中的數組元素和它的_modifying_ _actual_值。 – Oleksandra

+0

要真正改變'label',你必須使用類似'label [:] = ...'或'label [...] = ...'的東西。如果你想要去那條路線,查看'nditer'教程。 – hpaulj

回答

3

您的迭代器不會創建索引,但陣列

for label in labels_class 

在上面label在實際的元素不是指數,但實際元素,你正在試圖改變

你可以做這樣的事情:

for i, label in enumerate(labels_class): 
    labels_class[i] = 1 if (label == classifier) else 0 
+0

這是解決方案!謝謝。但是,我必須說'label_class'中的'label'''不是_actual_元素,而是一個副本。 – Oleksandra

+0

你不需要'1 if ... else 0'部分,你可以離開'label == classifier'。 –

+0

@Oleksandra,例如,python變量與c變量不同。Python'ints'和''floats'是不可改變的,因此副本和_actual元素_之間沒有區別。 –

1

演示用nditer修改數組值的語法在

http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values

a = np.arange(6).reshape(2,3) 
for x in np.nditer(a, op_flags=['readwrite']): 
    x[...] = 2 * x 

'x應用省略號來索引' 指的是x[...]

使用enumerate索引也非常好。但這是通過nditer來完成的。請參閱nditer頁面中有關使用flags=['f_index']的後面部分。

在數組上迭代時,您需要清楚地理解可以修改的索引,標量或數組元素之間的差異。 x = 1A[i]= 1x[...]=1不一樣。