加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

使用Python中的单维数组进行多维数组索引

发布时间:2020-12-20 12:33:07 所属栏目:Python 来源:网络整理
导读:我有二维数组,X大小(500,10)和单维索引数组Y,其大小为500,其每个条目是相应X行的正确值列的索引,例如,y(0)是2然后它表示X的第一行的第2列是正确的,类似地,y(3)= 4表示X的行3和第4列具有正确的值. 我希望使用索引数组Y从X获得所有正确的值,而不使用任何循环,
我有二维数组,X大小(500,10)和单维索引数组Y,其大小为500,其每个条目是相应X行的正确值列的索引,例如,y(0)是2然后它表示X的第一行的第2列是正确的,类似地,y(3)= 4表示X的行3和第4列具有正确的值.

我希望使用索引数组Y从X获得所有正确的值,而不使用任何循环,即使用向量化,在这种情况下输出应为(500,1).但是当我做X [:,y]然后它给出输出(500,500).有人可以帮助我如何使用Y,PLZ正确索引数组X.

谢谢大家的帮助.

解决方法

另一种选择是多维列表位置索引:

import numpy as np

ncol = 10  # 10 in your case
nrow = 500  # 500 in your case
# just creating some test data:
x = np.arange(ncol*nrow).reshape(nrow,ncol)
y = (ncol * np.random.random_sample((nrow,1))).astype(int)

print(x)
print(y)
print(x[np.arange(nrow),y.T].T)

语法解释为here.您基本上需要每个维度的索引数组.在第一个维度中,在您的情况下,这只是[0,…,500],第二个维度是您的y数组.我们需要转置它(.T),因为它必须具有与第一个和输出数组相同的形状.第二个换位不是真的需要,但给你你想要的形状.

编辑:

性能问题出现了,我尝试了迄今为止提到的三种方法.你需要line_profiler运行以下内容

kernprof -l -v tmp.py

其中tmp.py是:

import numpy as np

@profile
def calc(x,y):
    z = np.arange(nrow)
    a = x[z,y.T].T  # mine,with the suggested speed up
    b = x[:,y].diagonal().T  # Christoph Terasa
    c = np.array([i[j] for i,j in zip(x,y)])  # tobias_k

    return (a,b,c)

ncol = 5  # 10 in your case
nrow = 10  # 500 in your case

x = np.arange(ncol*nrow).reshape(nrow,1))).astype(int)

a,c = calc(x,y)
print(a==b)
print(b==c)

我的python 2.7.6的输出:

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    3                                           @profile
    4                                           def calc(x,y):
    5         1            4      4.0      0.1      z = np.arange(nrow)
    6         1           35     35.0      0.8      a = x[z,y.T].T
    7         1         3409   3409.0     76.7      b = x[:,y].diagonal().T
    8       501          995      2.0     22.4      c = np.array([i[j] for i,y)])
    9                                           
    10         1            1      1.0      0.0      return (a,c)

其中%Time或Time是相关列.我不知道如何描述内存消耗,其他人则必须这样做.现在看起来我的解决方案对于所请求的尺寸来说是最快的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读