2015-04-06 29 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不一样。