python中赋值都是引用形式的,不要随便改动赋值后值的值,会影响原来变量的取值
import scanpy as sc
import numpy as np
aa=np.array([[1,2,3],[2,3,3],[3,2,1]])
adata=sc.AnnData(aa)
print(adata.X)
bb=adata.X
print(bb)
bb[1]=[100,200,300]## 千万不要乱赋值,否则会修改原来的值
print(bb)
print(adata.X)
结果如下
可以看到adata.X里面的值会自动修改,如果不想修改,就使用copy()
import scanpy as sc
import numpy as np
aa=np.array([[1,2,3],[2,3,3],[3,2,1]])
adata=sc.AnnData(aa)
print(adata.X)
bb=adata.X.copy()
print(bb)
bb[1]=[100,200,300]
print(bb)
print(adata.X)
结果如下
但是,这里需要注意的一点是,这种赋值对adata.raw是不起作用的
import scanpy as sc
import numpy as np
aa=np.array([[1,2,3],[2,3,3],[3,2,1]])
adata=sc.AnnData(aa)
adata.raw=adata ## 但是需要注意的是
sc.pp.scale(adata)
print(adata.X)
print("========")
print(adata.raw.X)
结果如下
可以看到,这里的adata.raw.X并没有因为adata.X的改变而改变
注意carDEC的这种写法
for batch_ in batch_list:
indices = [x == batch_ for x in batch]
sub_adata = adata[indices]
sc.pp.scale(sub_adata)
adata[indices] = sub_adata.X
adata.layers["normalized input"] = adata.X
注意这里的写法,我感觉写的比我好,这个写法不用再进行拼接,而batch的信息就不用再变化了。其实你可以想想这种写法就是这样的,因为我只需要对每个batch的数据进行一个变换,至于其他信息我就跟着batch一起变过来就可以了