努力用语言来描述这个问题,但是有一个看似简单的问题,我找不到答案。
我想使用一个列表/数组中的值和另一个列表/数组中的索引来创建数组。我希望新数组的形状与索引数组相同。
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循环来执行此操作,因为我们要查找成千上万的行,并且需要减少计算时间。再次感谢:)
答案 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数组)。