簡體   English   中英

從一維列表 numpy 創建一個多維數組

[英]Create a multidimensional array from 1-D list, numpy

努力用文字描述這個問題,但有一個看似簡單的問題我找不到答案。

我想使用一個列表/數組中的值和另一個列表/數組中的索引創建一個數組。 我希望新數組的形狀與索引數組相同。

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 循環的情況下執行此操作,因為我們正在查看數十萬行並且需要縮短計算時間。 再次感謝 :)

您可以使用列表理解:

>>> [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 的答案可能會稍微快一些(除非 Python 在幕后緩存數據),這可能對您在生產中更有用。 在本地進行測試,看看您是否得到類似或不同的答案。

只需將每個索引子列表應用於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])]

子列表的長度不同,因此無法將結果制成二維數組 - 它必須保留為列表(或者如果您堅持使用一維對象 dtype 數組)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM