Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 切片三维阵列numpy_Python_Arrays_Numpy - Fatal编程技术网

Python 切片三维阵列numpy

Python 切片三维阵列numpy,python,arrays,numpy,Python,Arrays,Numpy,考虑以下几点: In[1]: pos Out[1]: array([[0, 1, 2, 3], [2, 3, 4, 5], [0, 1, 6, 7], [2, 3, 6, 7], [2, 3, 8, 9], [4, 5, 8, 9], [6, 7, 8, 9]]) In[2]: pos = pos.reshape((7,1,4)) Out[2]: array([[[0, 1, 2, 3]], [[

考虑以下几点:

In[1]: pos
Out[1]:
array([[0, 1, 2, 3],
       [2, 3, 4, 5],
       [0, 1, 6, 7],
       [2, 3, 6, 7],
       [2, 3, 8, 9],
       [4, 5, 8, 9],
       [6, 7, 8, 9]])

In[2]: pos = pos.reshape((7,1,4))
Out[2]:
array([[[0, 1, 2, 3]],
       [[2, 3, 4, 5]],
       [[0, 1, 6, 7]],
       [[2, 3, 6, 7]],
       [[2, 3, 8, 9]],
       [[4, 5, 8, 9]],
       [[6, 7, 8, 9]]])

In[3]: af = np.zeros((7,10,4))
我想按照下面的循环替换af阵列中的特定位置:

for i in range(7):
    af[i,pos[i],pos[0]] = 1
有了这些,我想知道是否有任何方法可以在没有循环的情况下进行替换

In [391]: pos = np.array([[0, 1, 2, 3], 
     ...:        [2, 3, 4, 5], 
     ...:        [0, 1, 6, 7], 
     ...:        [2, 3, 6, 7], 
     ...:        [2, 3, 8, 9], 
     ...:        [4, 5, 8, 9], 
     ...:        [6, 7, 8, 9]])                                                                      
In [392]: af = np.zeros((7,10,4),int)                                                                
In [393]: for i in range(7): 
     ...:     af[i,pos[i],pos[0]] = 1 
     ...:                                                                                            
pos
重塑有什么不同吗

In [395]: pos1 = pos.reshape((7,1,4))                                                                
In [398]: af1 = np.zeros((7,10,4),int)                                                                                                                                                           
In [399]: for i in range(7): 
     ...:     af1[i,pos1[i],pos1[0]] = 1 
     ...:      
     ...:                                                                                            
In [400]: np.allclose(af,af1)                                                                        
Out[400]: True
不,所以我们还是算了吧

正如我所评论的那样,
x[np.arange(n),idx]
是一种像循环一样分配值的常用方法。索引数组需要相互广播以定义所需的元素

如果我们尝试:

In [403]: af[np.arange(7),pos,pos[0]]                                                                
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-403-6488d02c6898> in <module>
----> 1 af[np.arange(7),pos,pos[0]]

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (7,) (7,4) (4,) 

请定义用于计算af的nno通常
af[np.arange(7),pos]=1
可以工作-如果
pos
是1d数组。但你有一个二维或三维(重塑后);而且
pos[0]
使事情变得复杂。基本上,您需要3个索引一起广播以选择所需的元素。“高级索引”广播是关键概念。
In [404]: af[np.arange(7)[:,None],pos,pos[0]]                                                        
Out[404]: 
array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]])
In [405]: af2 = np.zeros((7,10,4),int)                                                               
In [406]: af2[np.arange(7)[:,None], pos,pos[0]] = 1                                                  
In [407]: np.allclose(af,af2)                                                                        
Out[407]: True