我的阵列来自下面的图像:
@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]]]
答案 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数组,view
为arr
。要更改其值,您需要使用切片表示法。 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)