从一维列表numpy创建多维数组

时间:2019-01-15 01:05:19

标签: python arrays numpy multidimensional-array indexing

努力用语言来描述这个问题,但是有一个看似简单的问题,我找不到答案。

我想使用一个列表/数组中的值和另一个列表/数组中的索引来创建数组。我希望新数组的形状与索引数组相同。

import numpy as np

a = np.array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2])

b = [[0, 1], [2, 3, 4], [6, 7, 8, 9, 10]]

result = func(a, b) #some function or operator...

print(result)
[[9, 8], [7, 6, 5], [3, 2, 1, 0, -1]]

谢谢! :)

编辑:

到目前为止,很好的解决方案,但是我宁愿不使用for循环来执行此操作,因为我们要查找成千上万的行,并且需要减少计算时间。再次感谢:)

2 个答案:

答案 0 :(得分:0)

您可以使用列表理解:

>>> [a[x[0]:x[-1]+1] for x in b]
[array([9, 8]), array([7, 6, 5]), array([ 3,  2,  1,  0, -1])]

编辑:您的问题表明您想要一个更快的选项,因此您可以测试以下脚本以查看哪种方式对您的Python安装更快:

#!/usr/bin/env python                                                               

import timeit

setup = '''                                                                         
import numpy as np                                                                  

a = np.array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2])                                
b = [[0, 1], [2, 3, 4], [6, 7, 8, 9, 10]]                                           
'''

test1 = '''                                                                         
def test():                                                                         
  return [a[x[0]:x[-1]+1] for x in b]                                               
'''

test2 = '''                                                                         
def test():                                                                         
  return [a[idx] for idx in b]                                                      
'''

print(timeit.timeit(setup = setup,
                    stmt = test1,
                    number = 1000000))

print(timeit.timeit(setup = setup,
                    stmt = test2,
                    number = 1000000))

在我的机器上,到目前为止给您的两种方法运行的大致相同,但是hpaulj的answer可能会稍微快一点(除非Python在后台缓存数据),这可能对您更有用在生产中。在本地进行测试,看看是否得到相似或不同的答案。

答案 1 :(得分:0)

只需将每个索引子列表应用于a

In [483]: a = np.array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2])
     ...: 
     ...: b = [[0, 1], [2, 3, 4], [6, 7, 8, 9, 10]]
     ...: 
     ...: 
In [484]: [a[idx] for idx in b]
Out[484]: [array([9, 8]), array([7, 6, 5]), array([ 3,  2,  1,  0, -1])]

子列表的长度不同,因此结果无法制成2d数组-必须保留列表(或者如果您坚持使用1d对象dtype数组)。