2014-09-10 96 views
6

我有一个n行大小为3的numpy数组A.每行由三个整数组成,每个整数指向numpy数组内的另一个位置。例如,如果我要使用N[4]表示的行,我使用N[N[4]]。目测:numpy数组中的奇怪赋值

N = np.array([[2, 3, 6], [12, 6, 9], [3, 10, 7], [8, 5, 6], [3, 1, 0] ... ]) 
N[4] = [3, 1 ,0] 
N[N[4]] = [[8, 5, 6] 
      [12, 6, 9] 
      [2, 3, 6]] 

我建立修饰N A功能,并且我需要修改N [N [X]]对于一些指定的x,它是(在实施例4)的参数也。我想改变所有的6子数组中的另一个号码(假设0),所以我用numpy.where找到索引,这是

where_is_6 = np.where(N[N[4]] == 6) 

现在,如果我直接替换像N[N[4]][where_is_6] = 0没有更改。如果我使用以前的参考像var = N[N[4]]然后var[where_is_6]更改已完成,但在本地对该功能,并且N不会全局更改。在这种情况下我能做什么?或者我做错了什么?

+0

另一个索引,索引将不会与您已经定义列表'N'的方式工作。你需要首先将N转换为'numpy.array()'。 – 2014-09-10 21:45:43

+0

我说这是一个numpy数组,代码虽然没有反映出来,现在正在编辑... – 2014-09-10 21:46:26

回答

6

听起来像是你只需要转换索引到原来N的坐标:

row_idxs = N[4] 
r,c = np.where(N[row_idxs] == 6) 
N[row_idxs[r],c] = 0 
+0

+1的确可以解决问题! – 2014-09-10 21:40:54

+0

是的!谢谢!下次我需要修改的时候,我会这样想。 – 2014-09-10 21:45:22

4

的问题是,N[N[4]]是一个新的数组,你可以做的检查:

print(N[N[4]].flags) 

C_CONTIGUOUS : True 
F_CONTIGUOUS : False 
OWNDATA : True 
WRITEABLE : True 
ALIGNED : True 
UPDATEIFCOPY : False 

其中OWNDATA显示了这个事实。

+0

感谢.flags提示!那么我能做些什么来做出改变? – 2014-09-10 21:36:41

+1

@AlejandroSazo好... perimosocordiae的答案似乎是一个很好的解决方案 – 2014-09-10 21:41:59