如何在python中使用视图对象而不是复制?

时间:2018-03-12 06:53:38

标签: python numpy

使用以下代码

fn_t1 = glob("/T1/*.nii")
fn_fl = glob("/flair/*.nii")
fn_lb = glob("/label/*.nii")

dat_t1 = np.empty(shape=(len(fn_t1),250,250,74), dtype=np.float32)
dat_fl = np.empty(shape=(len(fn_fl),250,250,74), dtype=np.float32)
dat_lb = np.empty(shape=(len(fn_lb),250,250,74), dtype=np.float32)

npad = ((5,5),(5,5),(13,13))

for cnt, f in enumerate(fn_t1):
    dat_t1[cnt] = np.pad(nib.load(f).get_data(), pad_width=npad,mode='constant', constant_values=0)
for cnt, f in enumerate(fn_fl):
    dat_fl[cnt] = np.pad(nib.load(f).get_data(), pad_width=npad, mode='constant', constant_values=0)
for cnt, f in enumerate(fn_lb):
    dat_lb[cnt] = np.pad(nib.load(f).get_data(), pad_width=npad, mode='constant', constant_values=0)


idx = np.transpose(np.unravel_index(np.random.choice(np.prod(1847893),size=1000,replace=False),1847893))

rolling_lb = rolling_window(dat_lb,(1,27,27,27))
rolling_t1 = rolling_window(dat_t1,(1,27,27,27))
rolling_fl = rolling_window(dat_fl,(1,27,27,27))

input_t1 =  np.empty(shape=(1000,27,27,27), dtype=np.float32)

voxels = (rolling_lb[...,13,13,13] > 0)

start_time = time.time()

print('------------------------------------------------')
print(np.may_share_memory(rolling_t1,dat_t1))
print(np.may_share_memory(rolling_t1,rolling_t1[voxels[:]]))

你得到这个输出:

True        
False

问题:

1:我不知道为什么第二个结果是False

2:我想知道如何更改rolling_t1[voxels[:]]以获得True结果。

1 个答案:

答案 0 :(得分:0)

第一个问题

你在这里看到的是

之间的区别

basic indexing

  

基本切片生成的所有数组始终是原始数组的视图。

advanced indexing

  

高级索引始终返回数据的副本(与返回视图的基本切片形成对比)。

因此使用var wh = $(window).height(); var waypoints = $('.sec1-dmush1').waypoint(function(direction) { $(this.element).addClass('onScroll'); console.log(11); }, { offset: wh-50 }); 进行索引会返回副本。

第二个问题

您不能使用任意索引索引数组并获取视图。要获得视图,索引需要使用常量步骤,并切片连续的内存区域,即符合基本索引的要求。使用布尔数组进行索引时通常不会出现这种情况。