【问题标题】:Efficient way of getting a subarray of an array that the indices are mapped获取索引映射的数组的子数组的有效方法
【发布时间】:2013-11-26 17:05:15
【问题描述】:

我有一个矩阵说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.]

【问题讨论】:

    标签: python arrays numpy matrix


    【解决方案1】:

    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).reshape(2, 2).T; a[b] = v 并与被复制的转置数组进行比较。使用 gh-3798 完成所有操作。
    • 对于那些想知道的人,this is gh-3798
    猜你喜欢
    • 2016-08-14
    • 2012-03-06
    • 2018-07-13
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多