【问题标题】:Asymmetric slicing python非对称切片 python
【发布时间】:2023-03-14 16:45:01
【问题描述】:

考虑以下矩阵:

X = np.arange(9).reshape(3,3)
     array([[0, 1, 2],
            [3, 4, 5],
            [6, 7, 8]]) 

假设我想对以下数组进行子集化

array([[0, 4, 2],
       [3, 7, 5]])

可以对行和列进行一些索引,例如

col=[0,1,2] 
row = [[0,1],[1,2],[0,1]]

如果我将结果存储在一个变量数组中,我可以使用以下代码:

array=np.zeros([2,3],dtype='int64')
for i in range(3):
    array[:,i]=X[row[i],col[i]]

有没有办法广播这种操作?我必须将其作为 5 Gb 大文件的数据清理阶段,我想使用 dask 来并行化它。但如果我第一次可以避免使用 for 循环,我会感觉很棒。

【问题讨论】:

    标签: python numpy vectorization slice dask


    【解决方案1】:

    对于带有NumPy's advanced-indexing 的数组,它将是 -

    X[row, np.asarray(col)[:,None]].T
    

    示例运行 -

    In [9]: X
    Out[9]: 
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    
    In [10]: col=[0,1,2] 
        ...: row = [[0,1],[1,2],[0,1]]
    
    In [11]: X[row, np.asarray(col)[:,None]].T
    Out[11]: 
    array([[0, 4, 2],
           [3, 7, 5]])
    

    【讨论】:

    • 谢谢,这正是我想要的。
    • 是否可以使用 numpy.take 进行相同的操作?我问这个是因为 dask 数组不支持这种花哨的索引,但实现了一个类似于 numpy.take 的函数。
    • @jmamath 你可以这样做:np.take(X, row*X.shape[1] + col[:,None]) for rowcol 作为数组。
    猜你喜欢
    • 2011-01-14
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2015-11-09
    • 2014-02-04
    • 2013-03-13
    相关资源
    最近更新 更多