为什么我不能改变numpy的阵列?

时间:2017-03-12 01:53:35

标签: python arrays numpy

我的阵列来自下面的图像:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_ROOT=D:\"
set "_SRC=files"
set "_DST=archive"
set /A "_AGE=7"

for /D %%A in ("%_ROOT%\*") do (
    for /D %%B in ("%%~A\*") do (
        for /D %%C in ("%%~B\*") do (
            forfiles /P "%%~C\%_SRC%" /M "*" /D -%_AGE% /C "cmd /C if @isdir==FALSE 2> nul mkdir 0x22%_DST%0x22 & move /Y @file 0x22%_DST%0x22"
        )
    )
)

endlocal
exit /B

我想将数组更改为零:

chrome.browserAction.onClicked.addListener(function(tab) {
    toggle = !toggle;
    if(toggle){
        chrome.browserAction.setIcon({path: "on.png", tabId:tab.id});
    }
    else{
        chrome.browserAction.setIcon({path: "off.png", tabId:tab.id});
    }
});

chrome.tabs.onActivated.addListener(function (tab) {
    if(toggle){
        chrome.browserAction.setIcon({path: "on.png", tabId:tab.id});
    }
    else{
        chrome.browserAction.setIcon({path: "off.png", tabId:tab.id});
    }
});

我知道如何实现它,但我只是想知道为什么我的原始代码不起作用。打印显示没有任何改变。

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

6 个答案:

答案 0 :(得分:3)

在您的循环中,您只需将名称col重新分配到列表[0,0,0],一遍又一遍。根本不是你想要的!要将3d数组更改为全零,只需执行此操作。

arr[:, :, :,] = 0
Bing bang热潮,你已经完成了。

答案 1 :(得分:0)

因为col是值而不是引用,请参阅Python objects confusion: a=b, modify b and a changes!

尝试改为:

a=0
b=0

for row in image_arr:

    for col in row:
        image_arr[a][b] = [0,0,0]
        a=a+1
    b=b+1

print image_arr

答案 2 :(得分:0)

这是因为col是副本而不是引用。对于所有python都是如此:

代码示例:

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

输出:

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

答案 3 :(得分:0)

您可以更改循环中的值col,但它与原始变量image_arr无关。 您可以使用doStuff来访问索引并直接修改image_arr变量。如下例所示:

enumerate

答案 4 :(得分:0)

您正在将col更改为新列表,但col不是row子列表的引用。相反,如果您更改col元素,那么您将获得所需的结果:

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

答案 5 :(得分: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)