2017-03-12 36 views
2

我的阵列是从图像whick象下面这样:为什么我不能改变numpy的数组?

[[[ 66.17041352 32.64576397 20.96214396]                                
    [ 66.17041352 32.64576397 20.96214396] 
    [ 65.96318838 32.36065031 16.13857633] 
    ..., 
    [ 69.04849876 28.06324166 26.57747623] 
    [ 63.7269604 32.96378326 25.94336956] 
    [ 53.96807994 39.33219382 23.9025511 ]] 

..., 
[[ 18.55833403 34.4104455 -9.75497344] 
    [ 18.55833403 34.4104455 -9.75497344] 
    [ 21.45103128 32.77919479 -3.84284208] 
    ..., 
    [ 44.64859327 41.89617915 14.25196745] 
    [ 43.40291913 43.25109885 17.43372679] 
    [ 43.30009306 47.94315449 15.59464532]] 

[[ 18.64249436 31.63054472 -7.56023249] 
    [ 18.64249436 31.63054472 -7.56023249] 
    [ 23.23099091 32.284216 -3.86411699] 
    ..., 
    [ 44.98536772 45.0246078 17.92556564] 
    [ 45.53417128 45.42120428 17.50264622] 
    [ 46.7226915 45.42428651 19.21054283]]] 

我想数组更改为零这样的:

[[[ 0. 0. 0.] 
    [ 0. 0. 0.] 
    [ 0. 0. 0.] 
    ..., 
    [ 0. 0. 0.] 
    [ 0. 0. 0.] 
    [ 0. 0. 0.]] 

..., 

[[ 0. 0. 0.] 
    [ 0. 0. 0.] 
    [ 0. 0. 0.] 
    ..., 

[[ 0. 0. 0.] 
    [ 0. 0. 0.] 
    [ 0. 0. 0.] 
    ..., 
    [ 0. 0. 0.] 
    [ 0. 0. 0.] 
    [ 0. 0. 0.]]] 

我知道如何做到这一点,但我只是想知道为什么我的源代码不起作用。打印显示没有任何变化。

for row in image_arr: 
    for col in row: 
     col = [0,0,0] 

print image_arr 

回答

3

在你的循环,你只是重新分配名字col到列表[0,0,0],一遍又一遍又一遍。根本不是你想要的!要改变你的3d阵列为全零,你只需要这样做。:

arr[:, :, :,] = 0 

Bing Bang boom,你完成了。

+5

这是第一个明确表示'col = [0,0,0]'只是_name重新绑定_--这是关键问题的答案。 numpy不会在这里返回拷贝,而是可以被突变的原始对象的视图(比如'col [:] = 0')只是关于_numpy_的一个事实; “col = [0,0,0]”永远不会起作用的事实是关于_Python_的一个基本事实。 – DSM

+2

或者更少的字符,'arr [...] = 0'甚至'arr [()] = 0' – Eric

0

这是因为col是一个副本不是一个引用。

代码示例:这对所有的Python的是真实的

simple = [1,2,3,4,5,6] 
print simple 
for elem in simple: 
    elem = 0 
print simple 

OUTPUT:

[1, 2, 3, 4, 5, 6] 
[1, 2, 3, 4, 5, 6] 

试试这个:

rows,cols,lens = arr.shape 
for r in range(rows): 
    for c in range(cols): 
     arr[r][c] = [0,0,0] 
+1

'col'不是任何东西的副本。如果是,那么'arr [r]'也是一个副本,所以'arr [r] [c] = something'也不能修改'arr'。 – DSM

0

您更改值山坳中环但它与原始变量image_arr无关。 您可以使用enumerate来访问索引并直接修改image_arr变量。如下面的例子:

import numpy as np 
image_arr = np.arange(30).reshape(3, 5, 2) 
print(image_arr) 

for i,row in enumerate(image_arr): 
    for j,col in enumerate(row): 
     image_arr[i][j]=0 

print(image_arr) 
0

你正在改变col到一个新的列表,但col不是的row子表的参考。相反,如果你改变的col元素,那么你将得到的结果你想要的:

for row in image_arr: 
    for col in row: 
     for i in range(len(col)) 
      col[i] = 0 
0

col是1d阵列,viewarr。要更改其值,您需要使用切片符号。 col=[0,0,0]重新分配变量而不改变迭代变量。可变性是这里的一个关键概念(也适用于列表和词典)。

In [254]: arr = np.ones((2,3,4)) 
In [255]: for row in arr: 
    ...:  for col in row: 
    ...:   col[:] = 0 # or = [1,2,3,5] 
    ...:   
In [256]: arr 
Out[256]: 
array([[[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]], 

     [[ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.], 
     [ 0., 0., 0., 0.]]]) 

既然你想改变所有的值,col[:]=0作品一样好col[:]=[0,0,0,0](在我的形状)。

但是,虽然我们是在它,任何这些工作也

In [257]: for row in arr: 
    ...:  row[:,:] = 1 
    ...:  
In [258]: arr 
Out[258]: 
array([[[ 1., 1., 1., 1.], 
     [ 1., 1., 1., 1.], 
...]]]) 
In [259]: arr[:,:,:]=2  # one : per dimension 
In [260]: arr[...] = 3  # ... shorthand for multiple : 

但为什么重置arr?为什么不制作一个具有相同形状的新阵列(并丢弃“原始”)?

arr1 = np.zeros_like(arr) 
相关问题