簡體   English   中英

對長度不相等的子列表的數組應用簡單的操作

[英]Apply simple operation on array with sublists of unequal length

我有一個由兩個長度不等的子列表組成的列表:

a = [[0.2, 0.3], [0.6, 0.5, 0.7, 0.8]]

我需要將所有元素除以10,因此盡管我可以將a轉換為一個numpy數組,然后像這樣應用操作:

np.asarray(a) / 10.

但這導致:

TypeError: unsupported operand type(s) for /: 'list' and 'float'

我可以這樣做:

np.asarray([np.asarray(a[0]), np.asarray(a[1])]) / 10.

但我很確定這不是執行此操作的pythonic方法。

在具有不同長度的子列表組成的數組上應用操作的正確方法是什么?

你需要numpy嗎? 否則,您可以使用簡單的列表理解:

b = [map(lambda x:x/10, i) for i in a]

我喜歡以下外觀:

In [273]: [(np.array(i)/10).tolist() for i in a]
Out[273]: [[0.02, 0.03], [0.06, 0.05, 0.06999999999999999, 0.08]]

簡單地將a轉換為array是不好的,因為它將元素(其中2個)留在列表中。

In [275]: np.array(a)
Out[275]: array([[0.2, 0.3], [0.6, 0.5, 0.7, 0.8]], dtype=object)

dtype=object數組僅是帶有數組包裝器的列表。 因此,如果要使用數組划分,則需要將子列表轉換為數組。

但是純列表理解版本看起來更干凈-以及更多的pythonic:

In [279]: [[j/10. for j in i] for i in a]
Out[279]: [[0.02, 0.03], [0.06, 0.05, 0.06999999999999999, 0.08]]

在我的書中,列表推導非常“ pythonic”。 嵌套的更是如此。 :)不必要地使用numpy是非Python的,尤其是在需要事后tolist


dtype=object數組嘗試將操作應用於每個元素,例如

np.array(a)/10 => np.array([i/10 for i in a])

由於未定義[2,3]/10 ,因此在子列表中不起作用。

但是,如果我們采取額外的步驟將子列表轉換為數組:

In [282]: aa=np.array([np.array(i) for i in a])

In [283]: aa/10.
Out[283]: array([array([ 0.02,  0.03]), array([ 0.06,  0.05,  0.07,  0.08])], dtype=object)

然后數組除法起作用。 但是,不要指望這適用於所有操作。 dtype=object數組代碼尚未完全開發。

如果您需要直接修改現有列表,則可以執行此操作。

for i1, l in enumerate(a):
    for i2, _ in enumerate(l):
        a[i1][i2] /= 10

暫無
暫無

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

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