Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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

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 获取索引映射的数组子数组的有效方法_Python_Arrays_Numpy_Matrix - Fatal编程技术网

Python 获取索引映射的数组子数组的有效方法

Python 获取索引映射的数组子数组的有效方法,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,我有一个矩阵说a。我需要得到它的一个子矩阵,它的索引基本上来自主矩阵索引的映射(这个映射不一定是1-1)。我有以下代码来生成子矩阵,这里的映射被认为是sum import numpy as np def transform(A): B=np.zeros(A.flatten().shape[0]) for i in range(A.flatten().shape[0]): multi_idx=np.unravel_index(i,A.shape) B

我有一个矩阵说
a
。我需要得到它的一个子矩阵,它的索引基本上来自主矩阵索引的映射(这个映射不一定是1-1)。我有以下代码来生成子矩阵,这里的映射被认为是
sum

import numpy as np
def transform(A):
    B=np.zeros(A.flatten().shape[0])
    for i in range(A.flatten().shape[0]):
        multi_idx=np.unravel_index(i,A.shape)
        B[np.sum(multi_idx)]=A[multi_idx] #the mapping applied on the indices: B[np.sum(multi_idx)]
    return B       
A=np.arange(27).reshape([3,3,3])
print A
print transform(A)        
输出:

[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]]

 [[ 9 10 11]
  [12 13 14]
  [15 16 17]]

 [[18 19 20]
  [21 22 23]
  [24 25 26]]]
[  0.   9.  18.  21.  24.  25.  26.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.]

np.ogrid
可以方便地根据数组中的索引生成表达式。比如说,

import numpy as np

A = np.arange(27).reshape([3,3,3])
B = np.zeros(A.size)
i, j, k = np.ogrid[0:3, 0:3, 0:3]
B[i+j+k] = A
print(B)
屈服

[  0.   9.  18.  21.  24.  25.  26.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.]
请注意,任务

B[X] = A
相当于

B[X.ravel()] = A.ravel()

作业是按从左到右的顺序完成的。因此,如果
X
有许多重复值,则只有最后一个值最终影响
B
。这可以按照您希望的方式处理映射的非一对一性。

我只想在numpy文档中添加一句话“对于高级赋值,通常不保证迭代顺序。这意味着如果元素设置多次,则无法预测最终结果。”(但它应该在这些定义良好的条件下继续工作)。@seberg,等一下!:D你是什么意思?如果我的地图不是1-1,它就不会工作了?!@seberg:你能举个例子说明赋值不是从左到右执行的吗?嗯,
a=np.zeros(4);b=np.array([[1,2],[2,3]]).T;v=np arange(4).重塑(2,2).T;a[b]=v
并与正在复制的转置数组进行比较。在应用gh-3798的情况下执行所有这些操作。对于那些想知道的人。