python多维数组索引操作_使用Python中的单维数组进行多维数组索引

本文探讨了在Python中使用NumPy进行多维数组索引的方法,包括直接索引、按列索引和列表推导式。通过性能测试展示了不同方法的效率差异,并提供了使用line_profiler进行性能分析的例子。
摘要由CSDN通过智能技术生成

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

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,ncol)

y = (ncol * np.random.random_sample((nrow, 1))).astype(int)

a, b, 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, j in zip(x, y)])

9

10 1 1 1.0 0.0 return (a,b,c)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值