import itertools
import numpy as np
comb = list(itertools.combinations(list(range(regions)), 2))
bands_info = []
coeff = np.zeros([bands, len(comb)])
for cla in range(classes):
class_info = data[:,cla*bands*regions:(cla+1)*bands*regions]
for bs in range(bands):
n = bs*regions
for i in range(len(comb)):
index1 = comb[i][0]+n
index2 = comb[i][1]+n
part1 = class_info[:, index1]
part2 = class_info[:, index2]
coeff[bs, i] = (np.corrcoef(part1, part2))[0, 1]
bands_info.append(coeff.reshape([1,-1]))
coeff_info = np.vstack((bands_info[0], bands_info[1], bands_info[2],bands_info[3]))
例如這個循環(huán)賦值過程说铃,最終得出來的結(jié)果是bands_info這個List里面每一個矩陣都是一樣的,這是為什么呢椿疗?我一開始也在這里糾結(jié)了很長時間橱鹏,思來想去感覺沒錯的呀膜蠢。后來想想以前學的C語言知識,才有點明白莉兰。原來python里面有淺層copy和深層copy這一說挑围,同是一個矩陣的話占用的是同一個地址,在里面進行重復(fù)賦值的話前面的值都會被覆蓋掉糖荒。不只是當前變量被覆蓋掉杉辙,就是你之后用到這個變量的也會被覆蓋。比如說你a的變量被b覆蓋了捶朵,那你后面用到a的變量的地方蜘矢,a的值也會變成b的值。是不是很可怕综看。
那么應(yīng)該怎么進行修改呢品腹?
import itertools
import numpy as np
comb = list(itertools.combinations(list(range(regions)), 2))
bands_info = []
for cla in range(classes):
coeff = np.zeros([bands, len(comb)])
class_info = data[:,cla*bands*regions:(cla+1)*bands*regions]
for bs in range(bands):
n = bs*regions
for i in range(len(comb)):
index1 = comb[i][0]+n
index2 = comb[i][1]+n
part1 = class_info[:, index1]
part2 = class_info[:, index2]
coeff[bs, i] = (np.corrcoef(part1, part2))[0, 1]
bands_info.append(coeff.reshape([1,-1]))
coeff_info = np.vstack((bands_info[0], bands_info[1], bands_info[2],bands_info[3]))
改成這樣就可以了。就是將初始矩陣在循環(huán)里在重新設(shè)定一遍红碑,意思相當就是給了一次新的地址舞吭,再進行復(fù)制的話就不會覆蓋前面的結(jié)果了。